| Index: google_apis/gcm/base/mcs_message.h
|
| diff --git a/google_apis/gcm/base/mcs_message.h b/google_apis/gcm/base/mcs_message.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..241c75d131140154f0087916f5383adc6e31ce91
|
| --- /dev/null
|
| +++ b/google_apis/gcm/base/mcs_message.h
|
| @@ -0,0 +1,85 @@
|
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef GOOGLE_APIS_GCM_BASE_MCS_MESSAGE_H_
|
| +#define GOOGLE_APIS_GCM_BASE_MCS_MESSAGE_H_
|
| +
|
| +#include <string>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "google_apis/gcm/base/gcm_export.h"
|
| +
|
| +namespace google {
|
| +namespace protobuf {
|
| +class MessageLite;
|
| +} // namespace protobuf
|
| +} // namespace google
|
| +
|
| +namespace gcm {
|
| +
|
| +// A wrapper for MCS protobuffers that encapsulates their tag, size and data
|
| +// in an immutable and thread-safe format. If a mutable version is desired,
|
| +// CloneProtobuf() should use used to create a new copy of the protobuf.
|
| +//
|
| +// Note: default copy and assign welcome.
|
| +class GCM_EXPORT MCSMessage {
|
| + public:
|
| + // Creates an invalid MCSMessage.
|
| + MCSMessage();
|
| + // Infers tag from |message|.
|
| + explicit MCSMessage(const google::protobuf::MessageLite& protobuf);
|
| + // |tag| must match |protobuf|'s message type.
|
| + MCSMessage(uint8 tag, const google::protobuf::MessageLite& protobuf);
|
| + // |tag| must match |protobuf|'s message type. Takes ownership of |protobuf|.
|
| + MCSMessage(uint8 tag,
|
| + scoped_ptr<const google::protobuf::MessageLite> protobuf);
|
| + ~MCSMessage();
|
| +
|
| + // Returns whether this message is valid or not (whether a protobuf was
|
| + // provided at construction time or not).
|
| + bool IsValid() const;
|
| +
|
| + // Getters for serialization.
|
| + uint8 tag() const { return tag_; }
|
| + int size() const {return size_; }
|
| + std::string SerializeAsString() const;
|
| +
|
| + // Getter for accessing immutable probotuf fields.
|
| + const google::protobuf::MessageLite& GetProtobuf() const;
|
| +
|
| + // Getter for creating a mutated version of the protobuf.
|
| + scoped_ptr<google::protobuf::MessageLite> CloneProtobuf() const;
|
| +
|
| + private:
|
| + class Core : public base::RefCountedThreadSafe<MCSMessage::Core> {
|
| + public:
|
| + Core();
|
| + Core(uint8 tag, const google::protobuf::MessageLite& protobuf);
|
| + Core(uint8 tag, scoped_ptr<const google::protobuf::MessageLite> protobuf);
|
| +
|
| + const google::protobuf::MessageLite& Get() const;
|
| +
|
| + private:
|
| + friend class base::RefCountedThreadSafe<MCSMessage::Core>;
|
| + ~Core();
|
| +
|
| + // The immutable protobuf.
|
| + scoped_ptr<const google::protobuf::MessageLite> protobuf_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(Core);
|
| + };
|
| +
|
| + // These are cached separately to avoid having to recompute them.
|
| + const uint8 tag_;
|
| + const int size_;
|
| +
|
| + // The refcounted core, containing the protobuf memory.
|
| + scoped_refptr<const Core> core_;
|
| +};
|
| +
|
| +} // namespace gcm
|
| +
|
| +#endif // GOOGLE_APIS_GCM_BASE_MCS_MESSAGE_H_
|
|
|