HaikuDepot: notify work status from main window
[haiku.git] / src / kits / support / ArchivingManagers.h
blobb4e55f5924f03d56530e3e2dc83a576077bb3574
1 /*
2 * Copyright 2010 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5 #ifndef _ARCHIVING_MANAGERS_H
6 #define _ARCHIVING_MANAGERS_H
9 #include <map>
11 #include <String.h>
12 #include <ObjectList.h>
13 #include <MessagePrivate.h>
15 #include <Archivable.h>
18 #define NULL_TOKEN -42
21 namespace BPrivate {
22 namespace Archiving {
24 extern const char* kManagedField;
27 class BManagerBase {
28 public:
29 enum manager_type {
30 ARCHIVE_MANAGER,
31 UNARCHIVE_MANAGER
34 BManagerBase(BMessage* topLevelArchive, manager_type type)
36 fTopLevelArchive(topLevelArchive),
37 fType(type)
39 MarkArchive(topLevelArchive);
43 static BManagerBase*
44 ManagerPointer(const BMessage* constArchive)
46 if (!constArchive)
47 return NULL;
49 BMessage* archive = const_cast<BMessage*>(constArchive);
51 return static_cast<BManagerBase*>(
52 BMessage::Private(archive).ArchivingPointer());
56 static void
57 SetManagerPointer(BMessage* archive, BManagerBase* manager)
59 BMessage::Private(archive).SetArchivingPointer(manager);
63 void
64 MarkArchive(BMessage* archive)
66 BManagerBase* manager = ManagerPointer(archive);
67 if (manager != NULL)
68 debugger("Overlapping managed archiving/unarchiving sessions!");
70 SetManagerPointer(archive, this);
74 void
75 UnmarkArchive(BMessage* archive)
77 BManagerBase* manager = ManagerPointer(archive);
78 if (manager == this)
79 SetManagerPointer(archive, NULL);
80 else
81 debugger("Overlapping managed archiving/unarchiving sessions!");
85 static BArchiveManager* ArchiveManager(const BMessage* archive);
86 static BUnarchiveManager* UnarchiveManager(const BMessage* archive);
88 protected:
89 ~BManagerBase()
91 UnmarkArchive(fTopLevelArchive);
94 protected:
95 BMessage* fTopLevelArchive;
96 manager_type fType;
100 class BArchiveManager: public BManagerBase {
101 public:
102 BArchiveManager(const BArchiver* creator);
104 status_t GetTokenForArchivable(BArchivable* archivable,
105 int32& _token);
107 status_t ArchiveObject(BArchivable* archivable,
108 bool deep, int32& _token);
110 bool IsArchived(BArchivable* archivable);
112 status_t ArchiverLeaving(const BArchiver* archiver,
113 status_t err);
115 void Acquire();
116 void RegisterArchivable(
117 const BArchivable* archivable);
119 private:
120 ~BArchiveManager();
122 struct ArchiveInfo;
123 typedef std::map<const BArchivable*, ArchiveInfo> TokenMap;
125 TokenMap fTokenMap;
126 const BArchiver* fCreator;
127 status_t fError;
133 class BUnarchiveManager: public BManagerBase {
134 public:
135 BUnarchiveManager(BMessage* topLevelArchive);
137 status_t GetArchivableForToken(int32 token,
138 BUnarchiver::ownership_policy owning,
139 BArchivable*& _archivable);
141 bool IsInstantiated(int32 token);
143 void RegisterArchivable(BArchivable* archivable);
144 status_t UnarchiverLeaving(const BUnarchiver* archiver,
145 status_t err);
146 void Acquire();
148 void RelinquishOwnership(BArchivable* archivable);
149 void AssumeOwnership(BArchivable* archivable);
150 private:
151 ~BUnarchiveManager();
153 status_t _ExtractArchiveAt(int32 index);
155 struct ArchiveInfo;
157 ArchiveInfo* fObjects;
158 int32 fObjectCount;
159 int32 fTokenInProgress;
160 int32 fRefCount;
161 status_t fError;
165 } // namespace Archiving
166 } // namespace BPrivate
169 #endif // _ARCHIVING_MANAGERS_H