diff --git a/headers/os/support/Archivable.h b/headers/os/support/Archivable.h index 121b789c9a..6424240b8d 100644 --- a/headers/os/support/Archivable.h +++ b/headers/os/support/Archivable.h @@ -25,51 +25,52 @@ using BPrivate::Archiving::BUnarchiveManager; class BArchivable { public: - BArchivable(BMessage* from); - BArchivable(); - virtual ~BArchivable(); + BArchivable(BMessage* from); + BArchivable(); + virtual ~BArchivable(); - virtual status_t Archive(BMessage* into, bool deep = true) const; - static BArchivable* Instantiate(BMessage* archive); + virtual status_t Archive(BMessage* into, bool deep = true) const; + static BArchivable* Instantiate(BMessage* archive); - virtual status_t Perform(perform_code d, void* arg); + virtual status_t Perform(perform_code d, void* arg); - virtual status_t AllUnarchived(const BMessage* archive); - virtual status_t AllArchived(BMessage* archive) const; + virtual status_t AllUnarchived(const BMessage* archive); + virtual status_t AllArchived(BMessage* archive) const; private: - virtual void _ReservedArchivable3(); + virtual void _ReservedArchivable3(); - uint32 _reserved[2]; + uint32 _reserved[2]; }; class BArchiver { public: - BArchiver(BMessage* archive); - ~BArchiver(); + BArchiver(BMessage* archive); + ~BArchiver(); - status_t AddArchivable(const char* name, - BArchivable* archivable, bool deep = true); + status_t AddArchivable(const char* name, + BArchivable* archivable, bool deep = true); - status_t GetTokenForArchivable(BArchivable* archivable, - int32& _token, bool deep = true); + status_t GetTokenForArchivable(BArchivable* archivable, + int32& _token, bool deep = true); - bool IsArchived(BArchivable* archivable); - status_t Finish(); - BMessage* ArchiveMessage() const; + bool IsArchived(BArchivable* archivable); + status_t Finish(); + BMessage* ArchiveMessage() const; private: friend class BArchivable; - BArchiver(); // not defined - BArchiver(const BArchiver&); // not defined + BArchiver(); // not defined + BArchiver(const BArchiver&); // not defined - void RegisterArchivable(const BArchivable* archivable); + void RegisterArchivable( + const BArchivable* archivable); - BArchiveManager* fManager; - BMessage* fArchive; - bool fFinished; + BArchiveManager* fManager; + BMessage* fArchive; + bool fFinished; }; @@ -100,6 +101,7 @@ public: static bool IsArchiveManaged(BMessage* archive); static BMessage* PrepareArchive(BMessage*& archive); + private: friend class BArchivable; diff --git a/headers/private/app/MessagePrivate.h b/headers/private/app/MessagePrivate.h index fb79a2f275..dc749a0f41 100644 --- a/headers/private/app/MessagePrivate.h +++ b/headers/private/app/MessagePrivate.h @@ -191,14 +191,12 @@ class BMessage::Private { reply, sendTimeout, replyTimeout); } - void* ArchivingPointer() { return fMessage->fArchivingPointer; } - void SetArchivingPointer(void* pointer) { diff --git a/src/kits/support/Archivable.cpp b/src/kits/support/Archivable.cpp index 82a44173b7..8a8c76cdcd 100644 --- a/src/kits/support/Archivable.cpp +++ b/src/kits/support/Archivable.cpp @@ -295,8 +295,10 @@ BArchivable::AllArchived(BMessage* archive) const return B_OK; } + // #pragma mark - + BArchiver::BArchiver(BMessage* archive) : fManager(BManagerBase::ArchiveManager(archive)), @@ -744,9 +746,11 @@ find_instantiation_func(BMessage* archive) return find_instantiation_func(name, signature); } + // BArchivable binary compatability #if __GNUC__ == 2 + extern "C" status_t _ReservedArchivable1__11BArchivable(BArchivable* archivable, const BMessage* archive) @@ -759,6 +763,7 @@ _ReservedArchivable1__11BArchivable(BArchivable* archivable, return performData.return_value; } + extern "C" status_t _ReservedArchivable2__11BArchivable(BArchivable* archivable, BMessage* archive) @@ -771,8 +776,10 @@ _ReservedArchivable2__11BArchivable(BArchivable* archivable, return performData.return_value; } + #elif __GNUC__ > 2 + extern "C" status_t _ZN11BArchivable20_ReservedArchivable1Ev(BArchivable* archivable, const BMessage* archive) @@ -785,6 +792,7 @@ _ZN11BArchivable20_ReservedArchivable1Ev(BArchivable* archivable, return performData.return_value; } + extern "C" status_t _ZN11BArchivable20_ReservedArchivable2Ev(BArchivable* archivable, BMessage* archive) @@ -797,8 +805,10 @@ _ZN11BArchivable20_ReservedArchivable2Ev(BArchivable* archivable, return performData.return_value; } + #endif // _GNUC__ > 2 + void BArchivable::_ReservedArchivable3() {} diff --git a/src/kits/support/ArchivingManagers.cpp b/src/kits/support/ArchivingManagers.cpp index 780d5e40f6..819825ce4d 100644 --- a/src/kits/support/ArchivingManagers.cpp +++ b/src/kits/support/ArchivingManagers.cpp @@ -18,7 +18,8 @@ namespace Archiving { const char* kArchiveCountField = "_managed_archive_count"; const char* kArchivableField = "_managed_archivable"; const char* kTokenField = "_managed_token"; -} } +} +} using namespace BPrivate::Archiving; @@ -111,6 +112,7 @@ BArchiveManager::GetTokenForArchivable(BArchivable* archivable, int32& _token) return B_OK; } + status_t BArchiveManager::ArchiveObject(BArchivable* archivable, bool deep) { @@ -127,9 +129,10 @@ BArchiveManager::ArchiveObject(BArchivable* archivable, bool deep) MarkArchive(info.archive); status_t err = archivable->Archive(info.archive, deep); - if (err != B_OK) + if (err != B_OK) { fTokenMap.erase(archivable); // info.archive gets deleted here + } return err; } @@ -141,7 +144,7 @@ BArchiveManager::IsArchived(BArchivable* archivable) if (!archivable) return true; - return (fTokenMap.find(archivable) != fTokenMap.end()); + return fTokenMap.find(archivable) != fTokenMap.end(); } @@ -149,14 +152,12 @@ status_t BArchiveManager::ArchiverLeaving(const BArchiver* archiver) { if (archiver == fCreator) { - // first, we must sort the objects into the order they were archived in - typedef std::pair archivePair ; - archivePair pairs[fTokenMap.size()]; + typedef std::pair ArchivePair; + ArchivePair pairs[fTokenMap.size()]; for(TokenMap::iterator it = fTokenMap.begin(), end = fTokenMap.end(); - it != end; it++) { - + it != end; it++) { ArchiveInfo& info = it->second; pairs[info.token].first = info.archive; pairs[info.token].second = it->first; @@ -169,8 +170,7 @@ BArchiveManager::ArchiverLeaving(const BArchiver* archiver) status_t err = B_ERROR; int32 count = fTokenMap.size(); for (int32 i = 0; i < count; i++) { - - const archivePair& pair = pairs[i]; + const ArchivePair& pair = pairs[i]; err = pair.second->AllArchived(pair.first); if (err == B_OK && i > 0) { @@ -228,6 +228,7 @@ struct BUnarchiveManager::ArchiveInfo { // #pragma mark - + BUnarchiveManager::BUnarchiveManager(BMessage* archive) : BManagerBase(archive, BManagerBase::UNARCHIVE_MANAGER), @@ -308,7 +309,6 @@ status_t BUnarchiveManager::UnarchiverLeaving(const BUnarchiver* unarchiver) { if (--fRefCount == 0) { - fRefCount = -1; // make sure we de not end up here again! diff --git a/src/kits/support/ArchivingManagers.h b/src/kits/support/ArchivingManagers.h index 5d0bfa10ca..abea19f6b3 100644 --- a/src/kits/support/ArchivingManagers.h +++ b/src/kits/support/ArchivingManagers.h @@ -14,6 +14,7 @@ #include + namespace BPrivate { namespace Archiving { @@ -21,6 +22,7 @@ extern const char* kArchiveCountField; extern const char* kArchivableField; extern const char* kTokenField; + class BManagerBase { public: enum manager_type { @@ -80,11 +82,12 @@ public: static BUnarchiveManager* UnarchiveManager(const BMessage* archive); protected: - ~BManagerBase() { UnmarkArchive(fTopLevelArchive); } + +protected: BMessage* fTopLevelArchive; manager_type fType; }; @@ -92,21 +95,23 @@ protected: class BArchiveManager: public BManagerBase { public: - BArchiveManager(const BArchiver* creator); + BArchiveManager(const BArchiver* creator); - status_t GetTokenForArchivable(BArchivable* archivable, - int32& _token); + status_t GetTokenForArchivable(BArchivable* archivable, + int32& _token); - status_t ArchiveObject(BArchivable* archivable, bool deep); + status_t ArchiveObject(BArchivable* archivable, + bool deep); - bool IsArchived(BArchivable* archivable); + bool IsArchived(BArchivable* archivable); - status_t ArchiverLeaving(const BArchiver* archiver); - void Acquire(); - void RegisterArchivable(const BArchivable* archivable); + status_t ArchiverLeaving(const BArchiver* archiver); + void Acquire(); + void RegisterArchivable( + const BArchivable* archivable); private: - ~BArchiveManager(); + ~BArchiveManager(); struct ArchiveInfo; typedef std::map TokenMap; @@ -120,27 +125,29 @@ private: class BUnarchiveManager: public BManagerBase { public: - BUnarchiveManager(BMessage* topLevelArchive); + BUnarchiveManager(BMessage* topLevelArchive); - status_t ArchivableForToken(BArchivable** archivable, - int32 token); + status_t ArchivableForToken(BArchivable** archivable, + int32 token); - bool IsInstantiated(int32 token); + bool IsInstantiated(int32 token); - void RegisterArchivable(BArchivable* archivable); - status_t UnarchiverLeaving(const BUnarchiver* archiver); - void Acquire(); + void RegisterArchivable(BArchivable* archivable); + status_t UnarchiverLeaving(const BUnarchiver* archiver); + void Acquire(); private: - ~BUnarchiveManager(); - status_t _ExtractArchiveAt(int32 index); - status_t _InstantiateObjectForToken(int32 token); + ~BUnarchiveManager(); - struct ArchiveInfo; - ArchiveInfo* fObjects; - int32 fObjectCount; - int32 fTokenInProgress; - int32 fRefCount; + status_t _ExtractArchiveAt(int32 index); + status_t _InstantiateObjectForToken(int32 token); + + struct ArchiveInfo; + + ArchiveInfo* fObjects; + int32 fObjectCount; + int32 fTokenInProgress; + int32 fRefCount; };