| Index: base/serializable_object.h
|
| diff --git a/base/serializable_object.h b/base/serializable_object.h
|
| deleted file mode 100644
|
| index 5dd712dd19c70fc120d201e81acca2d97a5e7874..0000000000000000000000000000000000000000
|
| --- a/base/serializable_object.h
|
| +++ /dev/null
|
| @@ -1,373 +0,0 @@
|
| -// Copyright 2005-2009 Google Inc.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -// ========================================================================
|
| -//
|
| -// Declares class SerializableObject
|
| -//
|
| -// Provides the base class framework for those objects to be serialized
|
| -//
|
| -// Currently we support the serialization for the following member type
|
| -//
|
| -// 1) Value-type object
|
| -// 2) CString
|
| -// 3) Nested serializable object
|
| -// 4) Vector of the value-type objects
|
| -// 5) Vector of CString
|
| -// 6) Vector of serializable objects
|
| -//
|
| -// Usage:
|
| -//
|
| -// 1) Declare the object class, which you want to serialize, to be derived
|
| -// from SerializableObject
|
| -// 2) In its constructor, call AddSerializableMember(...) to add those fields
|
| -// to be included in the serialization
|
| -// 3) If you need to serialize a vector of serializable objects,
|
| -// a) The inner object class has to implement copy constructor and
|
| -// operator =
|
| -// b) The outer object class has to override SerializeVectorNestedObject()
|
| -// and DeserializeVectorNestedObject() (see sample)
|
| -//
|
| -// Versioning support:
|
| -//
|
| -// To add new fields in the new version, call
|
| -// AddSerializableMember(version, &member);
|
| -// If "version" is not given, it is 0 by default.
|
| -//
|
| -// To deserialize the data for latest version, call
|
| -// Deserialize(data, size, kLatestSerializableVersion);
|
| -// To deserialize the data for a particular version, call
|
| -// Deserialize(data, size, version);
|
| -//
|
| -// Sample:
|
| -//
|
| -// class FooObject : public SerializableObject {
|
| -// ...
|
| -// };
|
| -//
|
| -// class BarObject : public SerializableObject {
|
| -// public:
|
| -// BarObject() {
|
| -// AddSerializableMember(&value1_);
|
| -// AddSerializableMember(&value2_);
|
| -// AddSerializableMember(&value3_);
|
| -// AddSerializableMember(&value4_);
|
| -// AddSerializableMember(&value5_);
|
| -// AddSerializableMember(&value6_);
|
| -// AddSerializableMember(1, &value7_); // New version
|
| -// }
|
| -//
|
| -// protected:
|
| -// virtual bool SerializeVectorNestedObject(std::vector<byte>* data,
|
| -// const byte* ptr) const {
|
| -// ASSERT(data, (_T("")));
|
| -// ASSERT(ptr, (_T("")));
|
| -// if (ptr == reinterpret_cast<const byte*>(&value6_))
|
| -// return SerializeVectorNestedObjectHelper(data, &value6_);
|
| -// return false;
|
| -// }
|
| -//
|
| -// virtual bool DeserializeVectorNestedObject(byte** data,
|
| -// int size,
|
| -// byte* ptr,
|
| -// uint32 version) {
|
| -// ASSERT(data, (_T("")));
|
| -// ASSERT(*data, (_T("")));
|
| -// ASSERT(ptr, (_T("")));
|
| -// if (ptr == reinterpret_cast<byte*>(&value6_))
|
| -// return DeserializeVectorNestedObjectHelper(data,
|
| -// size,
|
| -// &value6_,
|
| -// version);
|
| -// return false;
|
| -// }
|
| -//
|
| -// private:
|
| -// int value1_;
|
| -// CString value2_;
|
| -// FooObject value3_;
|
| -// std::vector<byte> value4_;
|
| -// std::vector<CString> value5_;
|
| -// std::vector<BarObject> value6_;
|
| -// int value7_;
|
| -// };
|
| -//
|
| -// Binary format:
|
| -//
|
| -// 1) Value type: data
|
| -// e.g. 100 => 64 00 00 00
|
| -// 2) CString: size count data
|
| -// e.g. "ABC" => 02 00 00 00 03 00 00 00 41 00 42 00 43 00
|
| -// 3) Vector: size count data
|
| -// e.g. vector<int> = {1, 2}
|
| -// => 04 00 00 00 02 00 00 00 01 00 00 00 02 00 00 00
|
| -//
|
| -// TODO(omaha):
|
| -// 1) Define struct TypeTrait for all type-related info
|
| -// 2) Initialize TypeTrait on per-type basis instead of per-object basis
|
| -
|
| -#ifndef OMAHA_COMMON_SERIALIZABLE_OBJECT_H_
|
| -#define OMAHA_COMMON_SERIALIZABLE_OBJECT_H_
|
| -
|
| -#include <vector>
|
| -#include "base/basictypes.h"
|
| -#include "omaha/base/debug.h"
|
| -#include "omaha/base/type_utils.h"
|
| -
|
| -namespace omaha {
|
| -
|
| -// Constants
|
| -const uint32 kLatestSerializableVersion = 0xFFFFFFFF;
|
| -
|
| -// Serializable object
|
| -class SerializableObject {
|
| - private:
|
| - // Define SerializableMemberType, for internal use
|
| - typedef uint32 SerializableMemberType;
|
| -
|
| - #define SERIALIZABLE_VALUE_TYPE 1
|
| - #define SERIALIZABLE_CSTRING 2
|
| - #define SERIALIZABLE_NESTED_OBJECT 3
|
| - #define SERIALIZABLE_VECTOR 0x8000
|
| -
|
| - // Serializable member info
|
| - struct SerializableMemberInfo {
|
| - byte* ptr; // Pointers to the serializable member
|
| - SerializableMemberType type; // Type of the serializable member
|
| - int size; // Size of the serializable member
|
| - uint32 version; // Version when the member is added
|
| -
|
| - SerializableMemberInfo()
|
| - : ptr(NULL), type(SERIALIZABLE_VALUE_TYPE), size(0) {}
|
| - };
|
| -
|
| - public:
|
| - // Constructor
|
| - SerializableObject() {}
|
| -
|
| - // Destructor
|
| - virtual ~SerializableObject() {}
|
| -
|
| - // Serialize
|
| - bool Serialize(std::vector<byte>* data) const;
|
| -
|
| - // Deserialize the data for the latest version
|
| - bool Deserialize(byte* data, int size) {
|
| - return Deserialize(data, size, kLatestSerializableVersion);
|
| - }
|
| -
|
| - // Deserialize the data for a particular version
|
| - bool Deserialize(byte* data, int size, uint32 version);
|
| -
|
| - protected:
|
| - // Clear the serializable member list
|
| - void ClearSerializableMemberList() {
|
| - members_.clear();
|
| - }
|
| -
|
| - // Add value-typed member to the serializable member list
|
| - template<typename T>
|
| - void AddSerializableMember(T* ptr) {
|
| - return AddSerializableMember(0, ptr);
|
| - }
|
| -
|
| - // Add value-typed member to the serializable member list
|
| - template<typename T>
|
| - void AddSerializableMember(uint32 version, T* ptr) {
|
| - if (SUPERSUBCLASS(SerializableObject, T)) {
|
| - #pragma warning(push)
|
| - // reinterpret_cast used between related classes
|
| - #pragma warning(disable : 4946)
|
| - return AddSerializableMember(version,
|
| - reinterpret_cast<SerializableObject*>(ptr),
|
| - sizeof(T));
|
| - #pragma warning(pop)
|
| - }
|
| - SerializableMemberInfo member;
|
| - member.ptr = reinterpret_cast<byte*>(ptr);
|
| - member.type = SERIALIZABLE_VALUE_TYPE;
|
| - member.size = sizeof(T);
|
| - member.version = version;
|
| - members_.push_back(member);
|
| - }
|
| -
|
| - // Add CString-typed member to the serializable member list
|
| - void AddSerializableMember(CString* ptr) {
|
| - AddSerializableMember(0, ptr);
|
| - }
|
| -
|
| - // Add CString-typed member to the serializable member list
|
| - void AddSerializableMember(uint32 version, CString* ptr) {
|
| - SerializableMemberInfo member;
|
| - member.ptr = reinterpret_cast<byte*>(ptr);
|
| - member.type = SERIALIZABLE_CSTRING;
|
| - member.size = sizeof(TCHAR);
|
| - member.version = version;
|
| - members_.push_back(member);
|
| - }
|
| -
|
| - // Add nested serializable member to the serializable member list
|
| - void AddSerializableMember(SerializableObject* ptr, int size) {
|
| - AddSerializableMember(0, ptr, size);
|
| - }
|
| -
|
| - // Add nested serializable member to the serializable member list
|
| - void AddSerializableMember(uint32 version,
|
| - SerializableObject* ptr,
|
| - int size) {
|
| - SerializableMemberInfo member;
|
| - member.ptr = reinterpret_cast<byte*>(ptr);
|
| - member.type = SERIALIZABLE_NESTED_OBJECT;
|
| - member.size = size;
|
| - member.version = version;
|
| - members_.push_back(member);
|
| - }
|
| -
|
| - // Add vector-typed member to the serializable member list
|
| - template<typename T>
|
| - void AddSerializableMember(std::vector<T>* ptr) {
|
| - AddSerializableMember(0, ptr);
|
| - }
|
| -
|
| - // Add vector-typed member to the serializable member list
|
| - template<typename T>
|
| - void AddSerializableMember(uint32 version, std::vector<T>* ptr) {
|
| - SerializableMemberInfo member;
|
| - member.ptr = reinterpret_cast<byte*>(ptr);
|
| - member.version = version;
|
| -
|
| - if (SUPERSUBCLASS(CString, T)) {
|
| - member.type =
|
| - static_cast<SerializableMemberType>(SERIALIZABLE_VECTOR |
|
| - SERIALIZABLE_CSTRING);
|
| - member.size = sizeof(TCHAR);
|
| - } else if (SUPERSUBCLASS(SerializableObject, T)) {
|
| - member.type =
|
| - static_cast<SerializableMemberType>(SERIALIZABLE_VECTOR |
|
| - SERIALIZABLE_NESTED_OBJECT);
|
| - member.size = sizeof(T);
|
| - } else {
|
| - member.type =
|
| - static_cast<SerializableMemberType>(SERIALIZABLE_VECTOR |
|
| - SERIALIZABLE_VALUE_TYPE);
|
| - member.size = sizeof(T);
|
| - }
|
| -
|
| - members_.push_back(member);
|
| - }
|
| -
|
| - // If there is a vector of SerializableObject to be serialized, the derived
|
| - // class need to provide the implementation
|
| - virtual bool SerializeVectorNestedObject(std::vector<byte>*,
|
| - const byte*) const {
|
| - ASSERT(false, (_T("Provide the implementation in the derived class.")));
|
| - return false;
|
| - }
|
| -
|
| - // Helper method to serialize a vector of SerializableObject
|
| - template<typename T>
|
| - bool SerializeVectorNestedObjectHelper(std::vector<byte>* data,
|
| - const std::vector<T>* list) const {
|
| - ASSERT(data, (_T("")));
|
| - ASSERT(list, (_T("")));
|
| - ASSERT(SUPERSUBCLASS(SerializableObject, T), (_T("")));
|
| -
|
| - // Size of SerializableObject is unknown
|
| - SerializeSizeAndCount(data, 0, list->size());
|
| - for (size_t i = 0; i < list->size(); ++i) {
|
| - // To work around compiler complaint while using dynamic_cast
|
| - SerializableObject* so =
|
| - const_cast<SerializableObject*>(
|
| - static_cast<const SerializableObject*>(&(*list)[i]));
|
| - bool res = so->Serialize(data);
|
| - if (!res)
|
| - return false;
|
| - }
|
| - return true;
|
| - }
|
| -
|
| - // If there is a vector of SerializableObject to be serialized, the derived
|
| - // class need to provide the implementation
|
| - virtual bool DeserializeVectorNestedObject(byte**, int, byte*, uint32) {
|
| - ASSERT(false, (_T("provide the implementation in the derived class.")));
|
| - return false;
|
| - }
|
| -
|
| - // Helper method to deserialize a vector of SerializableObject
|
| - template<typename T>
|
| - bool DeserializeVectorNestedObjectHelper(byte** data,
|
| - int size,
|
| - std::vector<T>* list,
|
| - uint32 version) {
|
| - ASSERT(data, (_T("")));
|
| - ASSERT(*data, (_T("")));
|
| - ASSERT(size, (_T("")));
|
| - ASSERT(list, (_T("")));
|
| - ASSERT(SUPERSUBCLASS(SerializableObject, T), (_T("")));
|
| -
|
| - byte* tail = *data + size;
|
| -
|
| - // Size of SerializableObject is unknown
|
| - int count = 0;
|
| - bool res = DeserializeSizeAndCount(&count, 0, data, size);
|
| - if (!res)
|
| - return false;
|
| -
|
| - for (int i = 0; i < count; ++i) {
|
| - T obj;
|
| - bool res = obj.DeserializeHelper(data, tail - *data, version);
|
| - if (!res)
|
| - return false;
|
| - list->push_back(obj);
|
| - }
|
| - return true;
|
| - }
|
| -
|
| - private:
|
| - // Serialize the size and count values
|
| - void SerializeSizeAndCount(std::vector<byte>* data,
|
| - int size,
|
| - int count) const;
|
| -
|
| - // Serialize a list of value-typed elements
|
| - void SerializeValueList(std::vector<byte>* ser_data,
|
| - const byte* raw_data,
|
| - int size,
|
| - int count) const;
|
| -
|
| - // Deserialize helper
|
| - bool DeserializeHelper(byte** data, int size, uint32 version);
|
| -
|
| - // Deserialize the size and count values
|
| - bool DeserializeSizeAndCount(int* count,
|
| - int size,
|
| - byte** ser_data,
|
| - int ser_size) const;
|
| -
|
| - // Deserialize a list of value-typed elements
|
| - bool DeserializeValueList(std::vector<byte>* raw_data,
|
| - int size,
|
| - byte** ser_data,
|
| - int ser_size);
|
| -
|
| - // List of serializable members
|
| - std::vector<SerializableMemberInfo> members_;
|
| -
|
| - // We need to initialize TypeTrait on per-type basis instead of per-object
|
| - // basis and remove the following use of macro.
|
| - DISALLOW_EVIL_CONSTRUCTORS(SerializableObject);
|
| -};
|
| -
|
| -} // namespace omaha
|
| -
|
| -#endif // OMAHA_COMMON_SERIALIZABLE_OBJECT_H_
|
|
|