2010-08-12 02:09:14 +04:00
|
|
|
/*
|
2013-02-07 06:05:00 +04:00
|
|
|
* Copyright 2010 Haiku, Inc. All rights reserved.
|
2010-08-12 02:09:14 +04:00
|
|
|
* Distributed under the terms of the MIT License.
|
|
|
|
*
|
|
|
|
* Author:
|
|
|
|
* Alex Wilson, yourpalal2@gmail.com
|
|
|
|
*
|
|
|
|
* Corresponds to:
|
2013-02-07 06:05:00 +04:00
|
|
|
* headers/os/support/Archivable.h rev 37751
|
|
|
|
* src/kits/support/Archivable.cpp rev 37751
|
2010-08-12 02:09:14 +04:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
2013-02-07 06:05:00 +04:00
|
|
|
/*!
|
|
|
|
\file Archivable.h
|
|
|
|
\ingroup support
|
2013-02-08 00:04:05 +04:00
|
|
|
\ingroup libbe
|
2013-02-07 06:05:00 +04:00
|
|
|
\brief Contains BArchiver class.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2010-08-12 02:09:14 +04:00
|
|
|
/*!
|
|
|
|
\class BArchiver
|
|
|
|
\ingroup support
|
2013-02-08 00:04:05 +04:00
|
|
|
\ingroup libbe
|
2010-08-12 02:09:14 +04:00
|
|
|
\brief A class that simplifies the archiving of complicated BArchivable
|
|
|
|
hierarchies.
|
|
|
|
|
|
|
|
The BArchiver class is a small class that is used for archiving of
|
|
|
|
complicated BArchivable hierarchies. Such a hierarchy may include
|
|
|
|
multiple BArchivable objects, each of which might be referenced by
|
|
|
|
many BArchivable objects. With the BArchiver class, you can be certain
|
|
|
|
that each BArchivable object is archived only once with very little work.
|
|
|
|
When used in conjuction with the BArchivable::AllArchived() and
|
|
|
|
BArchivable::AllUnarchived() methods, it is simple to rebuild your system of
|
|
|
|
references upon unarchival so that they are equivalent to those that were
|
|
|
|
present in your original hierarchy.
|
|
|
|
|
|
|
|
The objects you archive can be retrieved using a BUnarchiver object.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\fn BArchiver::BArchiver(BMessage* archive)
|
|
|
|
\brief Constructs a BArchiver object that manages \c archive.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\fn BArchiver::~BArchiver()
|
|
|
|
\brief Destroys a BArchiver object. If the BArchiver object has not had its
|
|
|
|
Finish() method called, this will be done now.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\fn status_t BArchiver::AddArchivable(const char* name,
|
|
|
|
BArchivable* archivable, bool deep = true)
|
|
|
|
\brief Adds a reference to \c archivable to the archive used to
|
|
|
|
construct this BArchiver. May call \c archivable's Archive() method.
|
|
|
|
|
|
|
|
\param name Where this reference will be stored in the archive.
|
|
|
|
\param archivable The BArchivable* object that to reference.
|
|
|
|
\param deep Passed to \c archivable->Archive() if \c archivable must
|
|
|
|
be archived.
|
|
|
|
|
|
|
|
Adds a reference to \c archivable to your archive. If \c archivable has
|
|
|
|
not yet been archived, then its Archive() method is called. BArchiver
|
|
|
|
can only track BArchivable objects that have been archived through this
|
|
|
|
method or the GetTokenForArchivable() methods.
|
|
|
|
|
|
|
|
\warning If you manually archive an object, and then pass it to
|
|
|
|
AddArchivable() or GetTokenForArchivable(), it will be archived again,
|
|
|
|
and when unarchived you will end up with two different BArchivable
|
|
|
|
objects.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\fn status_t BArchiver::GetTokenForArchivable(BArchivable* archivable,
|
|
|
|
bool deep, int32& _token);
|
2010-10-23 05:51:37 +04:00
|
|
|
\brief Get a token representing a BArchivable object for this archiving
|
2010-08-12 02:09:14 +04:00
|
|
|
session.
|
|
|
|
|
2010-10-23 05:51:37 +04:00
|
|
|
\param archivable The BArchivable object for which you wish to get a
|
|
|
|
token.
|
2010-08-12 02:09:14 +04:00
|
|
|
\param deep Controls how \c archivable will be archived, if it has not yet
|
|
|
|
been archived in this session.
|
|
|
|
\param[out] _token The token representing \c archivable is stored here.
|
|
|
|
|
|
|
|
Retrieves or creates a token to represent \c archivable in this archiving
|
|
|
|
session. If \c archivable has not yet been archived, it will be now. If
|
|
|
|
\c archivable gets archived, the \c deep parameter will be passed to its
|
|
|
|
Archive() method.
|
|
|
|
|
|
|
|
\warning If you manually archive an object, and then pass it to
|
|
|
|
GetTokenForArchivable(), it will be archived again, and when unarchived
|
|
|
|
you will end up with two different BArchivable objects.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\fn status_t BArchiver::GetTokenForArchivable(BArchivable* archivable,
|
|
|
|
int32 &_token)
|
|
|
|
\brief Equivalent to calling the expanded GetTokenForArchivable(
|
|
|
|
BArchivable*, bool, int32&), with the deep parameter equal to true.
|
|
|
|
|
|
|
|
\see GetTokenForArchivable(BArchivable*, bool, int32&)
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\fn bool BArchiver::IsArchived(BArchivable* archivable);
|
|
|
|
\brief Returns whether \c archivable has already been archived in this
|
|
|
|
session.
|
|
|
|
|
|
|
|
\retval true \c archivable has been archived in this archiving session.
|
|
|
|
\retval false \c archivable has not been archived in this archiving session.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\fn status_t BArchiver::Finish(status_t err = B_OK);
|
|
|
|
\brief Report any archiving errors and possibly complete the archiving
|
|
|
|
session.
|
|
|
|
\return The first error reported in this archiving session, or B_OK.
|
|
|
|
|
|
|
|
This method may finish an archiving session (triggering the call of all
|
|
|
|
archived objects' AllArchived() methods) if the following conditions
|
|
|
|
are true:
|
|
|
|
\li No errors have been reported to this or any other BArchiver object
|
|
|
|
within this session.
|
|
|
|
\li This is the last remaining BArchiver that has not had its Finish()
|
|
|
|
method invoked.
|
|
|
|
If you call this method with an error code not equal to B_OK, then this
|
|
|
|
archiving session has failed, archived objects will not have their
|
|
|
|
AllArchived() methods called, and any subsequent calls to this method
|
|
|
|
on any BArchiver objects in this session will return your error code.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\fn const BMessage* BArchiver::ArchiveMessage() const
|
|
|
|
\brief Returns the BMessage* used to construct this BArchiver. This is
|
|
|
|
the archive that AddArchivable() modifies.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|