00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "Servant.h"
00025 #include "Orb.h"
00026
00027 #ifdef HAVE_SYS_TYPES_H
00028 # include <sys/types.h>
00029 #endif
00030
00031 #ifdef HAVE_UNISTD_H
00032 # include <unistd.h>
00033 #elif defined(HAVE_PROCESS_H)
00034 # include <process.h>
00035 #endif
00036
00037 #include <stdio.h>
00038 #include <cstdlib>
00039 #include <assert.h>
00040
00041 #ifdef HAVE_IOSTREAM
00042 # include <iostream>
00043 #else
00044 # include <iostream.h>
00045 #endif
00046
00047 #ifdef HAVE_STD_IOSTREAM
00048 using namespace std;
00049 #endif
00050
00051 namespace OmniEvents {
00052
00053
00054 CORBA::Object_ptr createReference(
00055 PortableServer::POA_ptr poa,
00056 const char* repositoryId
00057 )
00058 {
00059 CORBA::String_var oidStr =newUniqueId();
00060
00061 PortableServer::ObjectId_var oid =
00062 PortableServer::string_to_ObjectId(oidStr.in());
00063
00064 CORBA::Object_var obj =
00065 poa->create_reference_with_id(oid.in(),repositoryId);
00066
00067 assert(!CORBA::is_nil(obj));
00068 return obj._retn();
00069 }
00070
00071 char* newUniqueId()
00072 {
00073 static long count=0;
00074 static omni_mutex mutex;
00075 int mypid =getpid();
00076 unsigned long sec,nsec;
00077 omni_thread::get_time(&sec,&nsec);
00078 char buf[128];
00079 {
00080 omni_mutex_lock l(mutex);
00081 sprintf(buf,"%lx.%d.%lx",++count,mypid,sec);
00082 }
00083 return CORBA::string_dup(buf);
00084 }
00085
00086
00087
00088
00089
00090
00091
00092 #if OMNIEVENTS__DEBUG_SERVANT
00093 # define OMNIEVENTS__ADDR "["<<long(this)<<"] "
00094 int Servant::_objectCount =0;
00095 #else
00096 # define OMNIEVENTS__ADDR
00097 #endif
00098
00099
00100 Servant::Servant(PortableServer::POA_ptr poa)
00101 : _poa(PortableServer::POA::_duplicate(poa))
00102 {
00103 #if OMNIEVENTS__DEBUG_SERVANT
00104 ++_objectCount;
00105 DB(21,OMNIEVENTS__ADDR "Servant::Servant() count="<<_objectCount)
00106 #endif
00107 }
00108
00109
00110 Servant::~Servant()
00111 {
00112 #if OMNIEVENTS__DEBUG_SERVANT
00113 --_objectCount;
00114 DB(20,OMNIEVENTS__ADDR "Servant::~Servant() count="<<_objectCount)
00115 #endif
00116 }
00117
00118
00119 PortableServer::POA_ptr Servant::_default_POA()
00120 {
00121 return PortableServer::POA::_duplicate(_poa.in());
00122 }
00123
00124
00125 void Servant::activateObjectWithId(const char* oidStr)
00126 {
00127 using namespace PortableServer;
00128 CORBA::String_var poaName =_poa->the_name();
00129 DB(5,OMNIEVENTS__ADDR "Activating object "<<poaName.in()<<"/"<<oidStr);
00130 try
00131 {
00132 ObjectId_var oid =string_to_ObjectId(oidStr);
00133 _poa->activate_object_with_id(oid.in(),this);
00134 }
00135 catch(CORBA::BAD_PARAM& ex)
00136 {
00137 DB(0,"Can't activate "<<oidStr<<": "
00138 "BAD_PARAM" IF_OMNIORB4(" ("<<NP_MINORSTRING(ex)<<")") )
00139 throw;
00140 }
00141 catch(POA::ServantAlreadyActive& ex)
00142 {
00143 DB(0,"Can't activate "<<oidStr<<": Servant is already active.")
00144 throw;
00145 }
00146 catch(POA::ObjectAlreadyActive& ex)
00147 {
00148 DB(0,"Can't activate "<<oidStr<<": Object is already active.")
00149 throw;
00150 }
00151 catch(POA::WrongPolicy& ex)
00152 {
00153 DB(0,"Can't activate "<<oidStr<<": POA '"<<poaName.in()
00154 <<"' has wrong policy for activate_object_with_id().")
00155 exit(1);
00156 }
00157 }
00158
00159
00160 void Servant::deactivateObject()
00161 {
00162 using namespace PortableServer;
00163 CORBA::String_var poaName =_poa->the_name();
00164
00165 ObjectId_var oid;
00166 try
00167 {
00168 oid=_poa->servant_to_id(this);
00169 }
00170 catch(POA::ServantNotActive& ex)
00171 {
00172 DB(0,"Can't deactivate servant: POA '"<<poaName.in()
00173 <<"' says it is not active.")
00174 return;
00175 }
00176 catch(POA::WrongPolicy& ex)
00177 {
00178 DB(0,"Can't deactivate servant: POA '"<<poaName.in()
00179 <<"' has wrong policy for servant_to_id().")
00180 exit(1);
00181 }
00182
00183 CORBA::String_var oidStr;
00184 try
00185 {
00186 oidStr=ObjectId_to_string(oid.in());
00187 }
00188 catch(CORBA::BAD_PARAM& ex)
00189 {
00190 DB(0,"Can't deactivate servant. ObjectId looks bad: "
00191 "BAD_PARAM" IF_OMNIORB4(" ("<<NP_MINORSTRING(ex)<<")") )
00192 return;
00193 }
00194
00195 try
00196 {
00197 DB(7,OMNIEVENTS__ADDR "Deactivating object "<<poaName<<"/"<<oidStr.in());
00198 _poa->deactivate_object(oid.in());
00199 }
00200 catch(POA::ObjectNotActive& ex)
00201 {
00202 DB(0,"Can't deactivate "<<oidStr<<": Object is not active.")
00203 return;
00204 }
00205 catch(POA::WrongPolicy& ex)
00206 {
00207 DB(0,"Can't deactivate "<<oidStr<<": POA '"<<poaName.in()
00208 <<"' has wrong policy for deactivate_object().")
00209 exit(1);
00210 }
00211 }
00212
00213 };