TAO_Service_Context Class Reference

Helper class for managing the service context list information. More...

#include <Service_Context.h>

List of all members.

Public Member Functions

 TAO_Service_Context (void)
 Constructor.
void set_context (const IOP::ServiceContext &context)
 = Generic components
int set_context (const IOP::ServiceContext &context, CORBA::Boolean replace)
void set_context (IOP::ServiceContext &context)
int get_context (IOP::ServiceContext &context) const
int get_context (IOP::ServiceId id, const IOP::ServiceContext **context) const
int get_context (IOP::ServiceId id, IOP::ServiceContext_out context)
void set_context (IOP::ServiceId id, TAO_OutputCDR &cdr)
void set_context (IOP::ServiceContext &context, TAO_OutputCDR &cdr)
bool is_service_id (IOP::ServiceId id)
int encode (TAO_OutputCDR &cdr) const
 = Marshaling and demarshaling the list
int decode (TAO_InputCDR &cdr)
IOP::ServiceContextList & service_info (void)
 Return the underlying service context list.
const IOP::ServiceContextList & service_info (void) const

Private Member Functions

void set_context_i (const IOP::ServiceContext &context)
 Helper methods to implement set_context().
void set_context_i (IOP::ServiceContext &context)
void add_context_i (const IOP::ServiceContext &context)
void add_context_i (IOP::ServiceContext &context)
void set_context_i (IOP::ServiceId id, TAO_OutputCDR &cdr)
void set_context_i (IOP::ServiceContext &context, TAO_OutputCDR &cdr)
int get_context_i (IOP::ServiceContext &context) const
 Helper methods to implement get_context().
 TAO_Service_Context (const TAO_Service_Context &)
TAO_Service_Contextoperator= (const TAO_Service_Context &)

Private Attributes

IOP::ServiceContextList service_context_
 The ServiceContextList info.

Friends

class TAO::CSD::FW_Server_Request_Wrapper


Detailed Description

Helper class for managing the service context list information.

This class is used to manipulate and access the service context list that is passed around with every GIOP request/reply. The definition of the service context list is simply a sequence of the following structures: typedef unsigned long ServiceId; struct ServiceContext { ServiceId context_id; sequence <octet> context_data; }; typedef sequence <ServiceContext> ServiceContextList;

the real motivation behind this class is to consolidate all the marshalling and unmarshalling information pertaining to service context list

Note:
Somewhere down the line we may want to use this class for fast access to the info that we need from the Service Context List.

Definition at line 60 of file Service_Context.h.


Constructor & Destructor Documentation

TAO_BEGIN_VERSIONED_NAMESPACE_DECL ACE_INLINE TAO_Service_Context::TAO_Service_Context ( void   ) 

Constructor.

Definition at line 8 of file Service_Context.inl.

00009   : service_context_ ()
00010 {
00011 }

TAO_Service_Context::TAO_Service_Context ( const TAO_Service_Context  )  [private]


Member Function Documentation

void TAO_Service_Context::add_context_i ( IOP::ServiceContext &  context  )  [private]

Definition at line 131 of file Service_Context.cpp.

References service_context_.

00132 {
00133   // @@ TODO Some contexts can show up multiple times, others
00134   //    can't find out and take appropiate action.
00135   CORBA::ULong const l = this->service_context_.length ();
00136   this->service_context_.length (l + 1);
00137   this->service_context_[l].context_id = context.context_id;
00138   CORBA::ULong const max = context.context_data.maximum ();
00139   CORBA::ULong const len = context.context_data.length ();
00140   CORBA::Octet* const buf = context.context_data.get_buffer (1);
00141   this->service_context_[l].context_data.replace (max, len, buf, 1);
00142 }

void TAO_Service_Context::add_context_i ( const IOP::ServiceContext &  context  )  [private]

Definition at line 145 of file Service_Context.cpp.

References service_context_.

Referenced by set_context(), and set_context_i().

00146 {
00147   // @@ TODO Some contexts can show up multiple times, others
00148   //    can't find out and take appropiate action.
00149   CORBA::ULong const l = this->service_context_.length ();
00150   this->service_context_.length (l + 1);
00151   this->service_context_[l] = context;
00152 }

int TAO_Service_Context::decode ( TAO_InputCDR cdr  ) 

Definition at line 213 of file Service_Context.cpp.

00214 {
00215   if (!(cdr >> this->service_context_))
00216     {
00217       return 0;
00218     }
00219 
00220   return 1;
00221 }

int TAO_Service_Context::encode ( TAO_OutputCDR cdr  )  const

= Marshaling and demarshaling the list

Definition at line 207 of file Service_Context.cpp.

00208 {
00209   return (cdr << this->service_context_);
00210 }

int TAO_Service_Context::get_context ( IOP::ServiceId  id,
IOP::ServiceContext_out  context 
)

Returns:
0 If a Service Context with the given ServiceId doesn't exist.

Definition at line 186 of file Service_Context.cpp.

References ACE_NEW_RETURN, and service_context_.

00188 {
00189   CORBA::ULong const len = this->service_context_.length ();
00190 
00191   for (CORBA::ULong i = 0; i < len; ++i)
00192     {
00193       if (id == this->service_context_[i].context_id)
00194         {
00195           ACE_NEW_RETURN (context, IOP::ServiceContext, 0);
00196 
00197           *(context.ptr ()) = this->service_context_[i];
00198 
00199           return 1;
00200         }
00201     }
00202 
00203   return 0;
00204 }

int TAO_Service_Context::get_context ( IOP::ServiceId  id,
const IOP::ServiceContext **  context 
) const

Get a reference to a context identified by id, return 0 if the component is not present.

Definition at line 170 of file Service_Context.cpp.

References service_context_.

00172 {
00173   for (CORBA::ULong i = 0; i != this->service_context_.length (); ++i)
00174     {
00175       if (id == this->service_context_[i].context_id)
00176         {
00177           *context = &this->service_context_[i];
00178           return 1;
00179         }
00180     }
00181 
00182   return 0;
00183 }

int TAO_Service_Context::get_context ( IOP::ServiceContext &  context  )  const

Get a copy of the context identified by <context.context_id>, return 0 if the component is not present.

Definition at line 155 of file Service_Context.cpp.

References service_context_.

00156 {
00157   for (CORBA::ULong i = 0; i != this->service_context_.length (); ++i)
00158     {
00159       if (context.context_id == this->service_context_[i].context_id)
00160         {
00161           context = this->service_context_[i];
00162           return 1;
00163         }
00164     }
00165 
00166   return 0;
00167 }

int TAO_Service_Context::get_context_i ( IOP::ServiceContext &  context  )  const [private]

Helper methods to implement get_context().

ACE_INLINE bool TAO_Service_Context::is_service_id ( IOP::ServiceId  id  ) 

Is the id available in the underlying service context list? If so return true, else return false

Definition at line 39 of file Service_Context.inl.

References service_context_.

00040 {
00041   for (CORBA::ULong i = 0;
00042        i != this->service_context_.length ();
00043        ++i)
00044     {
00045       if (id == this->service_context_[i].context_id)
00046         {
00047           return true;
00048         }
00049     }
00050   return false;
00051 }

TAO_Service_Context& TAO_Service_Context::operator= ( const TAO_Service_Context  )  [private]

ACE_INLINE const IOP::ServiceContextList & TAO_Service_Context::service_info ( void   )  const

Note:
This method is only for backward comptiblity. We need to get this removed once RT folks have their service addition info done through this interface

Definition at line 20 of file Service_Context.inl.

References service_context_.

00021 {
00022   return this->service_context_;
00023 }

ACE_INLINE IOP::ServiceContextList & TAO_Service_Context::service_info ( void   ) 

Return the underlying service context list.

Definition at line 14 of file Service_Context.inl.

References service_context_.

Referenced by TAO_Service_Context_Registry::process_service_contexts(), TAO_ServerRequest::reply_service_info(), TAO_Operation_Details::reply_service_info(), TAO_ServerRequest::request_service_info(), TAO_Operation_Details::request_service_info(), TAO_Operation_Details::reset_reply_service_info(), TAO_Operation_Details::reset_request_service_info(), and TAO_ServerRequest::TAO_ServerRequest().

00015 {
00016   return this->service_context_;
00017 }

ACE_INLINE void TAO_Service_Context::set_context ( IOP::ServiceContext &  context,
TAO_OutputCDR cdr 
)

Set the context from the CDR stream and return the context back to the caller. *Does not* modify the underlying service context list.

Definition at line 32 of file Service_Context.inl.

References set_context_i().

00034 {
00035   this->set_context_i (context, cdr);
00036 }

ACE_INLINE void TAO_Service_Context::set_context ( IOP::ServiceId  id,
TAO_OutputCDR cdr 
)

Set the context from the CDR stream and add that to the service Context list

Definition at line 26 of file Service_Context.inl.

References set_context_i().

00027 {
00028   this->set_context_i (id, cdr);
00029 }

void TAO_Service_Context::set_context ( IOP::ServiceContext &  context  ) 

Insert the component into the list, but efficiently stealing the contents of the octet sequence.

Definition at line 90 of file Service_Context.cpp.

References add_context_i().

00091 {
00092   this->add_context_i (context);
00093 }

int TAO_Service_Context::set_context ( const IOP::ServiceContext &  context,
CORBA::Boolean  replace 
)

Insert the component into the list, making a copy of the octet sequence. Search the list before insertion so that the insertion does not cause a duplicate context to be in the list. If the replace flag is true, update the specified context. Return 0 if the component was present and the replace flag was not set to true.

Definition at line 66 of file Service_Context.cpp.

References add_context_i(), and service_context_.

00068 {
00069   for (CORBA::ULong i = 0; i != this->service_context_.length (); ++i)
00070     {
00071       if (context.context_id == this->service_context_[i].context_id)
00072         {
00073           if (replace)
00074             {
00075               this->service_context_[i] = context;
00076               return 1;
00077             }
00078           else
00079             {
00080               return 0;
00081             }
00082         }
00083     }
00084 
00085   this->add_context_i (context);
00086   return 1;
00087 }

void TAO_Service_Context::set_context ( const IOP::ServiceContext &  context  ) 

= Generic components

Insert the component into the list, making a copy of the octet sequence.

Definition at line 60 of file Service_Context.cpp.

References add_context_i().

Referenced by TAO_IIOP_Transport::set_bidir_context_info().

00061 {
00062   this->add_context_i (context);
00063 }

void TAO_Service_Context::set_context_i ( IOP::ServiceContext &  context,
TAO_OutputCDR cdr 
) [private]

Definition at line 42 of file Service_Context.cpp.

References ACE_OutputCDR::begin(), ACE_Message_Block::cont(), ACE_OS::memcpy(), and ACE_OutputCDR::total_length().

00044 {
00045   // Make a *copy* of the CDR stream...
00046   size_t const length = cdr.total_length ();
00047   context.context_data.length (static_cast<CORBA::ULong> (length));
00048   CORBA::Octet *buf = context.context_data.get_buffer ();
00049 
00050   for (const ACE_Message_Block *i = cdr.begin ();
00051        i != 0;
00052        i = i->cont ())
00053     {
00054       ACE_OS::memcpy (buf, i->rd_ptr (), i->length ());
00055       buf += i->length ();
00056     }
00057 }

TAO_BEGIN_VERSIONED_NAMESPACE_DECL void TAO_Service_Context::set_context_i ( IOP::ServiceId  id,
TAO_OutputCDR cdr 
) [private]

Definition at line 20 of file Service_Context.cpp.

References ACE_OS::memcpy().

00021 {
00022   IOP::ServiceContext context;
00023   context.context_id = id;
00024 
00025   // Make a *copy* of the CDR stream...
00026   size_t const length = cdr.total_length ();
00027   context.context_data.length (static_cast<CORBA::ULong> (length));
00028   CORBA::Octet *buf = context.context_data.get_buffer ();
00029 
00030   for (const ACE_Message_Block *i = cdr.begin ();
00031        i != 0;
00032        i = i->cont ())
00033     {
00034       ACE_OS::memcpy (buf, i->rd_ptr (), i->length ());
00035       buf += i->length ();
00036     }
00037 
00038   this->set_context_i (context);
00039 }

void TAO_Service_Context::set_context_i ( IOP::ServiceContext &  context  )  [private]

Definition at line 113 of file Service_Context.cpp.

References add_context_i(), and service_context_.

00114 {
00115   for (CORBA::ULong i = 0; i != this->service_context_.length (); ++i)
00116     {
00117       if (context.context_id == this->service_context_[i].context_id)
00118         {
00119           CORBA::ULong const max = context.context_data.maximum ();
00120           CORBA::ULong const len = context.context_data.length ();
00121           CORBA::Octet * const buf = context.context_data.get_buffer (1);
00122           this->service_context_[i].context_data.replace (max, len, buf, 1);
00123           return;
00124         }
00125     }
00126 
00127   this->add_context_i (context);
00128 }

void TAO_Service_Context::set_context_i ( const IOP::ServiceContext &  context  )  [private]

Helper methods to implement set_context().

Definition at line 96 of file Service_Context.cpp.

References add_context_i(), and service_context_.

Referenced by set_context().

00097 {
00098   // @@ TODO Some contexts can show up multiple times, others
00099   //    can't find out and take appropiate action.
00100   for (CORBA::ULong i = 0; i != this->service_context_.length (); ++i)
00101     {
00102       if (context.context_id == this->service_context_[i].context_id)
00103         {
00104           this->service_context_[i] = context;
00105           return;
00106         }
00107     }
00108 
00109   this->add_context_i (context);
00110 }


Friends And Related Function Documentation

friend class TAO::CSD::FW_Server_Request_Wrapper [friend]

Declare FW_Server_Request_Wrapper a friend This friendship makes the FW_Server_Request_Wrapper be able to clone the TAO_Service_Context data member in TAO_ServerRequest.

Definition at line 66 of file Service_Context.h.


Member Data Documentation

IOP::ServiceContextList TAO_Service_Context::service_context_ [private]

The ServiceContextList info.

Definition at line 148 of file Service_Context.h.

Referenced by add_context_i(), get_context(), is_service_id(), service_info(), set_context(), and set_context_i().


The documentation for this class was generated from the following files:
Generated on Tue Feb 2 17:39:45 2010 for TAO by  doxygen 1.4.7