diff --git a/headers/private/app/MessageField.h b/headers/private/app/MessageField.h index 1f576e543c..9b45453424 100644 --- a/headers/private/app/MessageField.h +++ b/headers/private/app/MessageField.h @@ -79,6 +79,8 @@ class BMessageField virtual void PrintToStream(const char* name) const; virtual const void* DataAt(int32 index, ssize_t* size) const = 0; + virtual BMessageField* Clone() const = 0; + protected: virtual void PrintDataItem(int32 index) const = 0; @@ -106,6 +108,7 @@ struct BMessageFieldStoragePolicy inline const T& operator[](uint index) const { return fData[index]; } inline void Add(const T& data) { fData.push_back(data); } inline void Remove(uint index) { fData.erase(fData.begin() + index); } + inline void Copy(const Store& rhs) { fData = rhs.fData; } private: std::vector fData; @@ -183,6 +186,9 @@ class BMessageFieldImpl : public BMessageField { fData.Remove(index); }; virtual const void* DataAt(int32 index, ssize_t* size) const; + + virtual BMessageField* Clone() const; + StorageType& Data() { return fData; } protected: @@ -396,6 +402,30 @@ template class FlattenPolicy, class GetDataPolicy > +BMessageField* +BMessageFieldImpl:: +Clone() const +{ + BMessageFieldImpl* BMF = + new(nothrow) BMessageFieldImpl(Name(), Type()); + if (BMF) + { + BMF->fMaxSize = fMaxSize; + BMF->fFlags = fFlags; + BMF->fData.Copy(fData); + } + return BMF; +} +//------------------------------------------------------------------------------ +template +< + class T1, + class StoragePolicy, + class SizePolicy, + class PrintPolicy, + class FlattenPolicy, + class GetDataPolicy +> void BMessageFieldImpl:: PrintDataItem(int32 index) const @@ -489,19 +519,61 @@ struct BMessageFieldStoragePolicy { return fData[index].data; } inline const bool& operator[](uint index) const { return fData[index].data; } - void Add(const bool& data) + inline void Add(const bool& data) { fData.push_back(data); } - void Remove(uint index) + inline void Remove(uint index) { fData.erase(fData.begin() + index); } + inline void Copy(const Store& rhs) + { + if (&fData != &rhs.fData) + { + fData = rhs.fData; + } + } private: std::vector fData; }; }; +//------------------------------------------------------------------------------ +template<> +struct BMessageFieldStoragePolicy +{ + class Store + { + public: + inline size_t Size() const + { return fData.size(); } + inline BDataBuffer& operator[](uint index) + { return fData[index]; } + inline const BDataBuffer& operator[](uint index) const + { return fData[index]; } + inline void Add(const BDataBuffer& data) + { fData.push_back(data); } + inline void Remove(uint index) + { fData.erase(fData.begin() + index); } + void Copy(const Store& rhs) + { + if (&fData == &rhs.fData) + { + return; + } + + fData.clear(); + for (size_t i = 0; i < rhs.Size(); ++i) + { + Add(BDataBuffer(rhs[i], true)); + } + } + + private: + std::vector fData; + }; +}; // Size policy specializations ------------------------------------------------- template<> struct BMessageFieldSizePolicy { diff --git a/src/kits/app/MessageBody.cpp b/src/kits/app/MessageBody.cpp index e25e124410..19333c02c3 100644 --- a/src/kits/app/MessageBody.cpp +++ b/src/kits/app/MessageBody.cpp @@ -62,7 +62,14 @@ BMessageBody& BMessageBody::operator=(const BMessageBody &rhs) { if (this != &rhs) { - fData = rhs.fData; + MakeEmpty(); + for (TMsgDataMap::const_iterator i = rhs.fData.begin(); + i != rhs.fData.end(); + ++i) + { + BMessageField* BMF = i->second; + fData[BMF->Name()] = BMF->Clone(); + } fFlattenedSize = rhs.fFlattenedSize; } @@ -209,7 +216,8 @@ ssize_t BMessageBody::FlattenedSize() const for (TMsgDataMap::const_iterator i = fData.begin(); i != fData.end(); ++i) { - size += i->second->FlattenedSize(); + BMessageField* BMF = i->second; + size += BMF->FlattenedSize(); } return size; @@ -223,7 +231,8 @@ status_t BMessageBody::Flatten(BDataIO* stream) const i != fData.end() && !err; ++i) { - err = i->second->Flatten(*stream); + BMessageField* BMF = i->second; + err = BMF->Flatten(*stream); } if (!err)