2 * Copyright 2001-2010 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
11 #include <SupportDefs.h>
19 class BArchiveManager
;
20 class BUnarchiveManager
;
24 using ::BPrivate::Archiving::BArchiveManager
;
25 using ::BPrivate::Archiving::BUnarchiveManager
;
30 BArchivable(BMessage
* from
);
32 virtual ~BArchivable();
34 virtual status_t
Archive(BMessage
* into
, bool deep
= true) const;
35 static BArchivable
* Instantiate(BMessage
* archive
);
37 virtual status_t
Perform(perform_code d
, void* arg
);
39 virtual status_t
AllUnarchived(const BMessage
* archive
);
40 virtual status_t
AllArchived(BMessage
* archive
) const;
43 friend class BUnarchiveManager
;
45 virtual void _ReservedArchivable3();
47 int32 fArchivingToken
;
54 BArchiver(BMessage
* archive
);
57 status_t
AddArchivable(const char* name
,
58 BArchivable
* archivable
, bool deep
= true);
60 inline status_t
GetTokenForArchivable(BArchivable
* archivable
,
62 status_t
GetTokenForArchivable(BArchivable
* archivable
,
63 bool deep
, int32
& _token
);
65 bool IsArchived(BArchivable
* archivable
);
66 status_t
Finish(status_t err
= B_OK
);
67 BMessage
* ArchiveMessage() const;
70 friend class BArchivable
;
72 BArchiver(); // not defined
73 BArchiver(const BArchiver
&); // not defined
75 void RegisterArchivable(
76 const BArchivable
* archivable
);
78 BArchiveManager
* fManager
;
87 enum ownership_policy
{
89 B_DONT_ASSUME_OWNERSHIP
92 BUnarchiver(const BMessage
* archive
);
96 inline status_t
GetObject(int32 token
, T
*& object
);
99 status_t
GetObject(int32 token
, ownership_policy owning
,
103 inline status_t
FindObject(const char* name
, T
*& object
);
106 inline status_t
FindObject(const char* name
,
107 ownership_policy owning
,
111 inline status_t
FindObject(const char* name
,
112 int32 index
, T
*& object
);
115 status_t
FindObject(const char* name
, int32 index
,
116 ownership_policy owning
, T
*& object
);
118 inline status_t
EnsureUnarchived(const char* name
,
120 inline status_t
EnsureUnarchived(int32 token
);
122 bool IsInstantiated(int32 token
);
123 bool IsInstantiated(const char* name
,
126 status_t
Finish(status_t err
= B_OK
);
127 const BMessage
* ArchiveMessage() const;
129 void AssumeOwnership(BArchivable
* archivable
);
130 void RelinquishOwnership(BArchivable
* archivable
);
132 static bool IsArchiveManaged(const BMessage
* archive
);
133 static BMessage
* PrepareArchive(BMessage
*& archive
);
136 static status_t
InstantiateObject(BMessage
* archive
,
140 friend class BArchivable
;
142 BUnarchiver(); // not defined
143 BUnarchiver(const BUnarchiver
&); // not defined
145 void RegisterArchivable(BArchivable
* archivable
);
147 inline void _CallDebuggerIfManagerNull();
149 BUnarchiveManager
* fManager
;
150 const BMessage
* fArchive
;
158 typedef BArchivable
* (*instantiation_func
)(BMessage
*);
160 BArchivable
* instantiate_object(BMessage
* from
, image_id
* id
);
161 BArchivable
* instantiate_object(BMessage
* from
);
162 bool validate_instantiation(BMessage
* from
, const char* className
);
164 instantiation_func
find_instantiation_func(const char* className
,
165 const char* signature
);
166 instantiation_func
find_instantiation_func(const char* className
);
167 instantiation_func
find_instantiation_func(BMessage
* archive
);
171 BArchiver::GetTokenForArchivable(BArchivable
* archivable
, int32
& _token
)
173 return GetTokenForArchivable(archivable
, true, _token
);
178 status_t
BUnarchiver::FindObject
<BArchivable
>(const char* name
, int32 index
,
179 ownership_policy owning
, BArchivable
*& archivable
);
184 BUnarchiver::FindObject(const char* name
, int32 index
,
185 ownership_policy owning
, T
*& object
)
189 BArchivable
* interim
;
190 status_t err
= FindObject(name
, index
, owning
, interim
);
192 if (err
== B_OK
&& interim
) {
193 object
= dynamic_cast<T
*>(interim
);
196 // we will not be deleting this item, but it must be deleted
197 if (owning
== B_ASSUME_OWNERSHIP
)
198 RelinquishOwnership(interim
);
207 BUnarchiver::GetObject
<BArchivable
>(int32 token
,
208 ownership_policy owning
, BArchivable
*& object
);
213 BUnarchiver::GetObject(int32 token
, ownership_policy owning
, T
*& object
)
217 BArchivable
* interim
;
218 status_t err
= GetObject(token
, owning
, interim
);
220 if (err
== B_OK
&& interim
) {
221 object
= dynamic_cast<T
*>(interim
);
224 // we will not be deleting this item, but it must be deleted
225 if (owning
== B_ASSUME_OWNERSHIP
)
226 RelinquishOwnership(interim
);
235 BUnarchiver::GetObject(int32 token
, T
*& object
)
237 return GetObject
<T
>(token
, B_ASSUME_OWNERSHIP
, object
);
243 BUnarchiver::FindObject(const char* name
, ownership_policy owning
, T
*& object
)
245 return FindObject(name
, 0, owning
, object
);
251 BUnarchiver::FindObject(const char* name
, T
*& object
)
253 return FindObject
<T
>(name
, 0, B_ASSUME_OWNERSHIP
, object
);
259 BUnarchiver::FindObject(const char* name
,
260 int32 index
, T
*& object
)
262 return FindObject(name
, index
, B_ASSUME_OWNERSHIP
, object
);
267 BUnarchiver::EnsureUnarchived(int32 token
)
270 return GetObject(token
, B_DONT_ASSUME_OWNERSHIP
, dummy
);
275 BUnarchiver::EnsureUnarchived(const char* name
, int32 index
)
278 return FindObject(name
, index
, B_DONT_ASSUME_OWNERSHIP
, dummy
);
284 BUnarchiver::InstantiateObject
<BArchivable
>(BMessage
* from
,
285 BArchivable
*& object
);
290 BUnarchiver::InstantiateObject(BMessage
* archive
, T
*& object
)
294 BArchivable
* interim
;
295 status_t err
= InstantiateObject(archive
, interim
);
296 if (err
!= B_OK
|| interim
== NULL
)
299 object
= dynamic_cast<T
*>(interim
);
300 if (object
== NULL
) {
309 #endif // _ARCHIVABLE_H