#ifndef _OBJECTADAPTER_H
#define _OBJECTADAPTER_H

#include <tao/corba.h>
#include <tao/PortableServer/PortableServerC.h>
#include <tao/UserException.h>
#include "macro.h"

#ifndef OPENFUSION_COMMON_DLL
#define OPENFUSION_COMMON_DLL
#endif

class OPENFUSION_COMMON_DLL ObjectAdapter
{
public:

  ObjectAdapter (CORBA::ORB_ptr orb,
                 const CORBA::Boolean agent = 0);

  ObjectAdapter (CORBA::ORB_ptr orb,
                 const char *poaName,
                 const CORBA::Boolean agent = 0);

  void createTransient (PortableServer::ServantBase *pImpl);

  void createPersistent (PortableServer::ServantBase *pImpl);

  void create (CORBA::Boolean persistent = 0);

  void createTransient (void);

  void createPersistent (void);

  PortableServer::POA_ptr getPOA (void) const;

  char *getPoaName (void) const;

  void addServantToAdapter (PortableServer::ServantBase *pImpl,
                            const char *name,
                            CORBA::Boolean persistent = 0);

  void activateManager (void);

private:

  void initialiseRootPOA (void);

  CORBA::ORB_var orbVar_;

  CORBA::Boolean agent_;

  ACE_CString poaName_;

  PortableServer::POA_var rootPoaVar_;

  PortableServer::POA_var thisPoaVar_;

  PortableServer::POAManager_var poaManagerVar_;

  PortableServer::ObjectId_var managerIdVar_;
};


// ****************************************************************

class OPENFUSION_COMMON_DLL TestException : public CORBA::UserException
{
public:

  TestException (void);

  static TestException *_downcast (CORBA::Exception * ex);
  static CORBA::Exception *_alloc (void);

  virtual CORBA::Exception *_tao_duplicate (void) const;

  virtual void _raise (void) const;

  virtual void _tao_encode (TAO_OutputCDR & cdr) const;
  virtual void _tao_decode (TAO_InputCDR & cdr);
};

#endif  // _OBJECTADAPTER_H
