/**
 * @file
 * $Id$
 * $Revision$
 * $Author$
 * $Date$
 *
 * This file is part of The iWear Framework.
 *
 * The iWear Framework is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by the
 * Free Software Foundation as in version 2 of the License.

 * 
 * The iWear Framework is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * The iWear Framework; if not, write to the Free Software Foundation, Inc., 59
 * Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef __IWREMOTE_CLASSPROVIDER_H
#define __IWREMOTE_CLASSPROVIDER_H

#include <iwremote/protocol.h>
#include <iwremote/rootartano.h>

extern "C"
{
#include <stdint.h>
}

namespace iwear
{
    namespace net
    {
class RemoteObject;
/**
 * The class provider is a class that is intended to beeing instantiated
 * statically so that its constructor will fill in information needed by the RootArtano.
 *
 * It is mainly to provide a mechanism, that when we have a classid, we can
 * properly instantiate a Client class. In the future this might be usefuly for
 * dynamic server class instantiation as well, in case just a classid is requested
 *
 * @exp This is experimental and will change rapidly and heavily
 */
class ClassProvider
{
private:
protected:
    cid_t cid;
public:
    ClassProvider( cid_t _cid, RemoteObject* (*fp) ( CallManager* ), void (*init)() )
        : cid(_cid)
    {
	RootArtano::provide_client(_cid, fp );
	if( init != 0 )
	{
	    init(); // Call the static initialization of the class (experimental)
	}
    }

    virtual ~ClassProvider()
    {
	RootArtano::remove_client(cid);
    }
};

}
}
#endif
