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