POA_Helper.cpp

Go to the documentation of this file.
00001 // $Id: POA_Helper.cpp 79247 2007-08-07 15:24:22Z elliott_c $
00002 
00003 #include "orbsvcs/Notify/POA_Helper.h"
00004 
00005 #if ! defined (__ACE_INLINE__)
00006 #include "orbsvcs/Notify/POA_Helper.inl"
00007 #endif /* __ACE_INLINE__ */
00008 
00009 ACE_RCSID(RT_Notify, TAO_Notify_POA_Helper, "$Id: POA_Helper.cpp 79247 2007-08-07 15:24:22Z elliott_c $")
00010 
00011 #include "tao/debug.h"
00012 //#define DEBUG_LEVEL 10
00013 #ifndef DEBUG_LEVEL
00014 # define DEBUG_LEVEL TAO_debug_level
00015 #endif // DEBUG_LEVEL
00016 
00017 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00018 
00019 TAO_Notify_POA_Helper::TAO_Notify_POA_Helper (void)
00020 {
00021 }
00022 
00023 TAO_Notify_POA_Helper::~TAO_Notify_POA_Helper ()
00024 {
00025 }
00026 
00027 ACE_CString
00028 TAO_Notify_POA_Helper::get_unique_id (void)
00029 {
00030   /// Factory for generating unique ids for the POAs.
00031   static TAO_Notify_ID_Factory poa_id_factory;
00032 
00033   char buf[32];
00034   ACE_OS::itoa (poa_id_factory.id (), buf, 10);
00035 
00036   return ACE_CString (buf);
00037 }
00038 
00039 void
00040 TAO_Notify_POA_Helper::init (PortableServer::POA_ptr parent_poa, const char* poa_name)
00041 {
00042   CORBA::PolicyList policy_list (2);
00043 
00044   this->set_policy (parent_poa, policy_list);
00045 
00046   this->create_i (parent_poa, poa_name, policy_list);
00047 }
00048 
00049 #if !defined (CORBA_E_MICRO)
00050 void
00051 TAO_Notify_POA_Helper::init_persistent (PortableServer::POA_ptr parent_poa, const char* poa_name)
00052 {
00053   CORBA::PolicyList policy_list (2);
00054 
00055   this->set_persistent_policy (parent_poa, policy_list);
00056 
00057   this->create_i (parent_poa, poa_name, policy_list);
00058 }
00059 #endif /* !CORBA_E_MICRO */
00060 
00061 void
00062 TAO_Notify_POA_Helper::init (PortableServer::POA_ptr parent_poa)
00063 {
00064   ACE_CString child_poa_name = this->get_unique_id ();
00065 
00066   this->init (parent_poa, child_poa_name.c_str ());
00067 }
00068 
00069 void
00070 TAO_Notify_POA_Helper::set_policy (PortableServer::POA_ptr parent_poa, CORBA::PolicyList &policy_list)
00071 {
00072   policy_list.length (2);
00073 
00074   policy_list[0] =
00075     parent_poa->create_id_uniqueness_policy (PortableServer::UNIQUE_ID);
00076 
00077   policy_list[1] =
00078     parent_poa->create_id_assignment_policy (PortableServer::USER_ID);
00079 }
00080 
00081 
00082 #if !defined (CORBA_E_MICRO)
00083 void
00084 TAO_Notify_POA_Helper::set_persistent_policy (PortableServer::POA_ptr parent_poa, CORBA::PolicyList &policy_list)
00085 {
00086   policy_list.length (2);
00087 
00088   policy_list[0] =
00089     parent_poa->create_lifespan_policy (PortableServer::PERSISTENT);
00090 
00091   policy_list[1] =
00092     parent_poa->create_id_assignment_policy (PortableServer::USER_ID);
00093 }
00094 #endif /* !CORBA_E_MICRO */
00095 
00096 
00097 void
00098 TAO_Notify_POA_Helper::create_i (PortableServer::POA_ptr parent_poa, const char* poa_name, CORBA::PolicyList &policy_list)
00099 {
00100   PortableServer::POAManager_var manager =
00101     parent_poa->the_POAManager ();
00102 
00103   // Create the child POA.
00104   this->poa_ = parent_poa->create_POA (poa_name,
00105                                        manager.in (),
00106                                        policy_list);
00107 
00108   if (DEBUG_LEVEL > 0)
00109     {
00110       CORBA::String_var the_name = this->poa_->the_name ();
00111       ACE_DEBUG ((LM_DEBUG, "Created POA : %s\n", the_name.in ()));
00112     }
00113 
00114   /*
00115   // Destroy the policies
00116   for (CORBA::ULong index = 0; index < policy_list.length (); ++index)
00117     {
00118       policy_list[index]->destroy ();
00119     }
00120   */
00121 }
00122 
00123 PortableServer::ObjectId *
00124 TAO_Notify_POA_Helper::long_to_ObjectId (CORBA::Long id) const
00125 {
00126   // Modified code from string_to_ObjectId ..
00127   //
00128 
00129   CORBA::ULong buffer_size = 4;
00130 
00131   // Create the buffer for the Id
00132   CORBA::Octet *buffer = PortableServer::ObjectId::allocbuf (buffer_size);
00133 
00134   // Copy the contents
00135   ACE_OS::memcpy (buffer, (char*)&id, buffer_size);
00136 
00137   // @@ Pradeep: TAO guarantees that Long is 4 bytes wide, but the
00138   // standard only guarantees that it is at least 4 bytes wide. You
00139   // may want to think about that....
00140 
00141   // Create and return a new ID
00142   PortableServer::ObjectId *obj_id = 0;
00143   ACE_NEW_THROW_EX (obj_id,
00144                     PortableServer::ObjectId (buffer_size,
00145                                               buffer_size,
00146                                               buffer,
00147                                               1),
00148                     CORBA::NO_MEMORY ());
00149 
00150   return obj_id;
00151 }
00152 
00153 CORBA::Object_ptr
00154 TAO_Notify_POA_Helper::activate (PortableServer::Servant servant, CORBA::Long& id)
00155 {
00156   // Generate a new ID.
00157   id = this->id_factory_.id ();
00158 
00159   if (DEBUG_LEVEL > 0)
00160     {
00161       CORBA::String_var the_name = this->poa_->the_name ();
00162 
00163       ACE_DEBUG ((LM_DEBUG, "Activating object with id = %d in  POA : %s\n", id, the_name.in ()));
00164     }
00165 
00166   // Convert CORBA::Long to ObjectId
00167   PortableServer::ObjectId_var oid =
00168     this->long_to_ObjectId (id);
00169 
00170   poa_->activate_object_with_id (oid.in (),
00171                                  servant);
00172 
00173   return poa_->id_to_reference (oid.in ());
00174 }
00175 
00176 CORBA::Object_ptr
00177 TAO_Notify_POA_Helper::activate_with_id (PortableServer::Servant servant, CORBA::Long id)
00178 {
00179   if (DEBUG_LEVEL > 0)
00180     {
00181       CORBA::String_var the_name = this->poa_->the_name ();
00182       ACE_DEBUG ((LM_DEBUG, "Activating object with existing id = %d in  POA : %s\n", id, the_name.in ()));
00183     }
00184   this->id_factory_.set_last_used (id);
00185 
00186   // Convert CORBA::Long to ObjectId
00187   PortableServer::ObjectId_var oid =
00188     this->long_to_ObjectId (id);
00189 
00190   poa_->activate_object_with_id (oid.in (),
00191                                  servant);
00192 
00193   return poa_->id_to_reference (oid.in ());
00194 }
00195 
00196 void
00197 TAO_Notify_POA_Helper::deactivate (CORBA::Long id) const
00198 {
00199   // Convert CORBA::Long to ObjectId
00200   PortableServer::ObjectId_var oid =
00201     this->long_to_ObjectId (id);
00202 
00203   poa_->deactivate_object (oid.in ());
00204 }
00205 
00206 CORBA::Object_ptr
00207 TAO_Notify_POA_Helper::id_to_reference (CORBA::Long id) const
00208 {
00209   // Convert CORBA::Long to ObjectId
00210   PortableServer::ObjectId_var oid =
00211     this->long_to_ObjectId (id);
00212 
00213   return poa_->id_to_reference (oid.in ());
00214 }
00215 
00216 PortableServer::ServantBase *
00217 TAO_Notify_POA_Helper::reference_to_servant (CORBA::Object_ptr ptr) const
00218 {
00219   return poa_->reference_to_servant (ptr);
00220 }
00221 
00222 CORBA::Object_ptr
00223 TAO_Notify_POA_Helper::servant_to_reference (
00224     PortableServer::ServantBase * servant) const
00225 {
00226   return poa_->servant_to_reference (servant);
00227 }
00228 
00229 
00230 void
00231 TAO_Notify_POA_Helper::destroy (void)
00232 {
00233   poa_->destroy (1,0);
00234  // The <wait_for_completion> flag = 0
00235 }
00236 
00237 TAO_END_VERSIONED_NAMESPACE_DECL

Generated on Sun Jan 27 15:39:57 2008 for TAO_CosNotification by doxygen 1.3.6