xref: /haiku/docs/user/support/Archivable.dox (revision e3c5ca8539ce174c629280ca8a944dfbbcf64468)
181071f5eSNiels Sascha Reedijk/*
281071f5eSNiels Sascha Reedijk * Copyright 2007, Haiku, Inc. All Rights Reserved.
381071f5eSNiels Sascha Reedijk * Distributed under the terms of the MIT License.
481071f5eSNiels Sascha Reedijk *
537503f54SNiels Sascha Reedijk * Author:
681071f5eSNiels Sascha Reedijk *   Niels Sascha Reedijk <niels.reedijk@gmail.com>
7*e3c5ca85SNiels Sascha Reedijk *
837503f54SNiels Sascha Reedijk * Proofreader:
937503f54SNiels Sascha Reedijk *   David Weizades <ddewbofh@hotmail.com>
10*e3c5ca85SNiels Sascha Reedijk *   Thom Holwerda <slakje@quicknet.nl>
11*e3c5ca85SNiels Sascha Reedijk *
1281071f5eSNiels Sascha Reedijk * Corresponds to:
1381071f5eSNiels Sascha Reedijk *   /trunk/headers/os/support/Archivable.h rev 19972
1481071f5eSNiels Sascha Reedijk *   /trunk/src/kits/support/Archivable.cpp rev 19095
1581071f5eSNiels Sascha Reedijk */
1681071f5eSNiels Sascha Reedijk
1781071f5eSNiels Sascha Reedijk/*!
1881071f5eSNiels Sascha Reedijk  \file Archivable.h
1981071f5eSNiels Sascha Reedijk  \brief Provides the BArchivable interface.
2081071f5eSNiels Sascha Reedijk*/
2181071f5eSNiels Sascha Reedijk
2281071f5eSNiels Sascha Reedijk/*!
2381071f5eSNiels Sascha Reedijk  \class BArchivable
2481071f5eSNiels Sascha Reedijk  \ingroup support
2581071f5eSNiels Sascha Reedijk  \ingroup libbe
26*e3c5ca85SNiels Sascha Reedijk  \brief Interface for objects that can be archived into a BMessage.
2781071f5eSNiels Sascha Reedijk
2837503f54SNiels Sascha Reedijk  BArchivable provides an interface for objects that can be put into message
2937503f54SNiels Sascha Reedijk  archives and extracted into objects in another location. Using this you are
3037503f54SNiels Sascha Reedijk  able to send objects between applications, or even between computers across
3181071f5eSNiels Sascha Reedijk  networks.
3281071f5eSNiels Sascha Reedijk
3337503f54SNiels Sascha Reedijk  BArchivable differs from BFlattenable in that BFlattenable is designed to
3437503f54SNiels Sascha Reedijk  store objects into flat streams of data, the main objective being storage to
3537503f54SNiels Sascha Reedijk  disk. The objective of this interface, however, is to store objects that will
3637503f54SNiels Sascha Reedijk  be restored to other objects. To illustrate this point, BArchivable messages
3737503f54SNiels Sascha Reedijk  know how to restore themselves whereas BFlattenables have a datatype which
3837503f54SNiels Sascha Reedijk  you need to map to classes manually.
3981071f5eSNiels Sascha Reedijk
4037503f54SNiels Sascha Reedijk  Archiving is done with the Archive() method. If your class supports it, the
4137503f54SNiels Sascha Reedijk  caller can request it to store into a deep archive, meaning that all child
4237503f54SNiels Sascha Reedijk  objects in it will be stored. Extracting the archive works with the
4337503f54SNiels Sascha Reedijk  Instantiate() method, which is static. Since the interface is designed to
44*e3c5ca85SNiels Sascha Reedijk  extract objects without the caller knowing what kind of object it actually is,
4537503f54SNiels Sascha Reedijk  the global function #instantiate_object() instantiates a message without you
4637503f54SNiels Sascha Reedijk  manually having to determine the class the message is from. This adds
4737503f54SNiels Sascha Reedijk  considerable flexibility and allows BArchivable to be used in combination with
4837503f54SNiels Sascha Reedijk  other add-ons.
4981071f5eSNiels Sascha Reedijk
5037503f54SNiels Sascha Reedijk  To provide this interface in your classes you should publicly inherit this
5137503f54SNiels Sascha Reedijk  class. You should implement Archive() and Instantiate(), and provide one
5281071f5eSNiels Sascha Reedijk  constructor that takes one BMessage argument.
5381071f5eSNiels Sascha Reedijk*/
5481071f5eSNiels Sascha Reedijk
5581071f5eSNiels Sascha Reedijk/*!
5681071f5eSNiels Sascha Reedijk  \fn BArchivable::BArchivable(BMessage* from)
5781071f5eSNiels Sascha Reedijk  \brief Constructor. Does nothing.
5881071f5eSNiels Sascha Reedijk
5937503f54SNiels Sascha Reedijk  If you inherit this interface you should provide at least one constructor that
6037503f54SNiels Sascha Reedijk  takes one BMessage argument.
6181071f5eSNiels Sascha Reedijk*/
6281071f5eSNiels Sascha Reedijk
6381071f5eSNiels Sascha Reedijk/*!
6481071f5eSNiels Sascha Reedijk  \fn BArchivable::BArchivable()
6581071f5eSNiels Sascha Reedijk  \brief Constructor. Does nothing.
6681071f5eSNiels Sascha Reedijk*/
6781071f5eSNiels Sascha Reedijk
6881071f5eSNiels Sascha Reedijk/*!
6981071f5eSNiels Sascha Reedijk  \fn BArchivable::~BArchivable()
7081071f5eSNiels Sascha Reedijk  \brief Destructor. Does nothing.
7181071f5eSNiels Sascha Reedijk*/
7281071f5eSNiels Sascha Reedijk
7381071f5eSNiels Sascha Reedijk/*!
7481071f5eSNiels Sascha Reedijk  \fn virtual	status_t BArchivable::Archive(BMessage* into, bool deep = true) const
7581071f5eSNiels Sascha Reedijk  \brief Archive the object into a BMessage.
7681071f5eSNiels Sascha Reedijk
7737503f54SNiels Sascha Reedijk  You should call this method from your derived implementation as it adds the
7837503f54SNiels Sascha Reedijk  data needed to instantiate your object to the message.
7981071f5eSNiels Sascha Reedijk
8037503f54SNiels Sascha Reedijk  \param into The message you store your object in.
8137503f54SNiels Sascha Reedijk  \param deep If \c true, all children of this object should be stored as well.
82*e3c5ca85SNiels Sascha Reedijk    Only pay attention to this parameter if you actually have child objects.
8381071f5eSNiels Sascha Reedijk  \retval B_OK The archiving succeeded.
8481071f5eSNiels Sascha Reedijk  \retval "error codes" The archiving did not succeed.
8581071f5eSNiels Sascha Reedijk*/
8681071f5eSNiels Sascha Reedijk
8781071f5eSNiels Sascha Reedijk/*!
8881071f5eSNiels Sascha Reedijk  \fn static BArchivable* BArchivable::Instantiate(BMessage* archive)
8981071f5eSNiels Sascha Reedijk  \brief Static member to restore objects from messages.
9081071f5eSNiels Sascha Reedijk
9181071f5eSNiels Sascha Reedijk  You should always check that the \a archive argument actually corresponds to
9281071f5eSNiels Sascha Reedijk  your class. The automatic functions, such as #instantiate_object() will not
9337503f54SNiels Sascha Reedijk  choose the wrong class but manual calls to this member might be faulty.
9481071f5eSNiels Sascha Reedijk
9537503f54SNiels Sascha Reedijk  \param archive The message with the data of the object to restore.
9681071f5eSNiels Sascha Reedijk  \retval You should return a pointer to your object, or \c NULL if you
9737503f54SNiels Sascha Reedijk    fail.
9881071f5eSNiels Sascha Reedijk  \warning The default implementation will always return \c NULL. Even though
99*e3c5ca85SNiels Sascha Reedijk    it is possible to store plain BArchive objects, it is impossible to restore
10081071f5eSNiels Sascha Reedijk    them.
10181071f5eSNiels Sascha Reedijk  \see instantiate_object(BMessage *from)
10281071f5eSNiels Sascha Reedijk*/
10381071f5eSNiels Sascha Reedijk
10481071f5eSNiels Sascha Reedijk/*!
10581071f5eSNiels Sascha Reedijk  \fn virtual status_t BArchivable::Perform(perform_code d, void* arg)
10681071f5eSNiels Sascha Reedijk  \brief Internal method.
107*e3c5ca85SNiels Sascha Reedijk  \internal This method is defined in case of unforeseen binary compatibility
108*e3c5ca85SNiels Sascha Reedijk    API issues. Currently nothing of interest is implemented.
10981071f5eSNiels Sascha Reedijk*/
11081071f5eSNiels Sascha Reedijk
11137503f54SNiels Sascha Reedijk///// Global methods /////
11281071f5eSNiels Sascha Reedijk/*!
11381071f5eSNiels Sascha Reedijk  \addtogroup support_globals
11481071f5eSNiels Sascha Reedijk  @{
11581071f5eSNiels Sascha Reedijk*/
11681071f5eSNiels Sascha Reedijk
11781071f5eSNiels Sascha Reedijk/*!
11881071f5eSNiels Sascha Reedijk  \typedef typedef BArchivable* (*instantiation_func)(BMessage*)
11981071f5eSNiels Sascha Reedijk  \brief Internal definition of a function that can instantiate objects that
12081071f5eSNiels Sascha Reedijk    have been created with the BArchivable API.
12181071f5eSNiels Sascha Reedijk*/
12281071f5eSNiels Sascha Reedijk
12381071f5eSNiels Sascha Reedijk/*!
12481071f5eSNiels Sascha Reedijk  \fn BArchivable* instantiate_object(BMessage *from, image_id *id)
12581071f5eSNiels Sascha Reedijk  \brief Instantiate an archived object with the object being defined in a
12681071f5eSNiels Sascha Reedijk    different application or library.
12781071f5eSNiels Sascha Reedijk
12881071f5eSNiels Sascha Reedijk  This function is similar to instantiate_object(BMessage *from), except that
129*e3c5ca85SNiels Sascha Reedijk  it takes the \a id argument referring to an image where the object might be
13037503f54SNiels Sascha Reedijk  stored.
13181071f5eSNiels Sascha Reedijk
13237503f54SNiels Sascha Reedijk  \note Images are names for executable files. Image id's refer to these
13381071f5eSNiels Sascha Reedijk    executable files that have been loaded by your application. Have a look
134*e3c5ca85SNiels Sascha Reedijk    at the kernel API for further information.
13581071f5eSNiels Sascha Reedijk*/
13681071f5eSNiels Sascha Reedijk
13781071f5eSNiels Sascha Reedijk/*!
13881071f5eSNiels Sascha Reedijk  \fn BArchivable* instantiate_object(BMessage *from)
13981071f5eSNiels Sascha Reedijk  \brief Instantiate an archived object.
14081071f5eSNiels Sascha Reedijk
14137503f54SNiels Sascha Reedijk  This global function will determine the base class, based on the \a from
14281071f5eSNiels Sascha Reedijk  argument, and it will call the Instantiate() function of that object to
14381071f5eSNiels Sascha Reedijk  restore it.
14481071f5eSNiels Sascha Reedijk
14581071f5eSNiels Sascha Reedijk  \param from The archived object.
14681071f5eSNiels Sascha Reedijk  \return The object returns a pointer to the instantiated object, or \c NULL
14781071f5eSNiels Sascha Reedijk    if the instantiation failed. The global \c errno variable will contain the
14837503f54SNiels Sascha Reedijk    reason why it failed.
14981071f5eSNiels Sascha Reedijk  \see instantiate_object(BMessage *from, image_id *id)
15081071f5eSNiels Sascha Reedijk*/
15181071f5eSNiels Sascha Reedijk
15281071f5eSNiels Sascha Reedijk/*!
15381071f5eSNiels Sascha Reedijk  \fn bool validate_instantiation(BMessage* from, const char* className)
15481071f5eSNiels Sascha Reedijk  \brief Internal function that checks if the \a className is the same as the
15581071f5eSNiels Sascha Reedijk    one stored in the \a from message.
15681071f5eSNiels Sascha Reedijk*/
15781071f5eSNiels Sascha Reedijk
15881071f5eSNiels Sascha Reedijk/*!
15981071f5eSNiels Sascha Reedijk  \fn instantiation_func find_instantiation_func(const char* className,	const char* signature)
16081071f5eSNiels Sascha Reedijk  \brief Internal function that searches for the instantiation func with a
16181071f5eSNiels Sascha Reedijk    specific signature. Use instantiate_object() instead.
16281071f5eSNiels Sascha Reedijk*/
16381071f5eSNiels Sascha Reedijk
16481071f5eSNiels Sascha Reedijk/*!
16581071f5eSNiels Sascha Reedijk  \fn instantiation_func find_instantiation_func(const char* className)
16681071f5eSNiels Sascha Reedijk  \brief Internal function that searches for the instantiation func of a
16781071f5eSNiels Sascha Reedijk    specific class. Use instantiate_object() instead.
16881071f5eSNiels Sascha Reedijk*/
16981071f5eSNiels Sascha Reedijk
17081071f5eSNiels Sascha Reedijk/*!
17181071f5eSNiels Sascha Reedijk  \fn instantiation_func find_instantiation_func(BMessage* archive)
17281071f5eSNiels Sascha Reedijk  \brief Internal function that searches for the instantiation func that
17381071f5eSNiels Sascha Reedijk    works on the specified \a archive. Use instantiate_object() instead.
17481071f5eSNiels Sascha Reedijk*/
17581071f5eSNiels Sascha Reedijk
17681071f5eSNiels Sascha Reedijk//! @}
177