TAO_Service_Context Class Reference

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

#include <Service_Context.h>

Collaboration diagram for TAO_Service_Context:

Collaboration graph
[legend]
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)
int is_service_id (IOP::ServiceId id)
int encode (TAO_OutputCDR &cdr) const
 = Marshaling and demarshaling the list

int decode (TAO_InputCDR &cdr)
IOP::ServiceContextListservice_info (void)
 Return the underlying service context list.

const IOP::ServiceContextListservice_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 context_data; }; typedef sequence 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 132 of file Service_Context.cpp.

References IOP::ServiceContext::context_data, IOP::ServiceContext::context_id, TAO::unbounded_value_sequence< T >::get_buffer(), TAO::unbounded_value_sequence< T >::length(), TAO::unbounded_value_sequence< ServiceContext >::length(), TAO::unbounded_value_sequence< T >::maximum(), and TAO::unbounded_value_sequence< ServiceContext >::replace().

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

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

Definition at line 146 of file Service_Context.cpp.

References TAO::unbounded_value_sequence< ServiceContext >::length().

Referenced by set_context(), and set_context_i().

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

int TAO_Service_Context::decode TAO_InputCDR cdr  ) 
 

Definition at line 214 of file Service_Context.cpp.

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

int TAO_Service_Context::encode TAO_OutputCDR cdr  )  const
 

= Marshaling and demarshaling the list

Definition at line 208 of file Service_Context.cpp.

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

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 187 of file Service_Context.cpp.

References ACE_NEW_RETURN, TAO::unbounded_value_sequence< ServiceContext >::length(), TAO_Out_T< T >::ptr(), IOP::ServiceContext_out, and IOP::ServiceId.

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

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 171 of file Service_Context.cpp.

References TAO::unbounded_value_sequence< ServiceContext >::length(), and IOP::ServiceId.

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

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 156 of file Service_Context.cpp.

References IOP::ServiceContext::context_id, and TAO::unbounded_value_sequence< ServiceContext >::length().

Referenced by TAO_GIOP_Message_Generator_Parser_12::process_bidir_context().

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

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

Helper methods to implement get_context().

ACE_INLINE int TAO_Service_Context::is_service_id IOP::ServiceId  id  ) 
 

Is the available in the underlying service context list? If so return 1, else return 0

Definition at line 43 of file Service_Context.inl.

References TAO::unbounded_value_sequence< ServiceContext >::length(), and IOP::ServiceId.

Referenced by TAO_GIOP_Message_Generator_Parser_12::check_bidirectional_context().

00044 {
00045   for (CORBA::ULong i = 0;
00046        i != this->service_context_.length ();
00047        ++i)
00048     {
00049       if (id == this->service_context_[i].context_id)
00050         {
00051           return 1;
00052         }
00053     }
00054   return 0;
00055 }

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

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

Definition at line 20 of file Service_Context.inl.

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.

Referenced by 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 35 of file Service_Context.inl.

References set_context_i().

00037 {
00038   this->set_context_i (context,
00039                        cdr);
00040 }

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 27 of file Service_Context.inl.

References IOP::ServiceId, and set_context_i().

00029 {
00030   this->set_context_i (id,
00031                        cdr);
00032 }

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 91 of file Service_Context.cpp.

References add_context_i().

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

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 67 of file Service_Context.cpp.

References add_context_i(), IOP::ServiceContext::context_id, and TAO::unbounded_value_sequence< ServiceContext >::length().

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

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 61 of file Service_Context.cpp.

References add_context_i().

Referenced by TAO_IIOP_Transport::set_bidir_context_info().

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

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

Definition at line 43 of file Service_Context.cpp.

References ACE_OutputCDR::begin(), ACE_Message_Block::cont(), IOP::ServiceContext::context_data, TAO::unbounded_value_sequence< T >::get_buffer(), ACE_Message_Block::length(), TAO::unbounded_value_sequence< T >::length(), ACE_OS::memcpy(), ACE_Message_Block::rd_ptr(), and ACE_OutputCDR::total_length().

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

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_OutputCDR::begin(), ACE_Message_Block::cont(), IOP::ServiceContext::context_data, IOP::ServiceContext::context_id, TAO::unbounded_value_sequence< T >::get_buffer(), ACE_Message_Block::length(), TAO::unbounded_value_sequence< T >::length(), ACE_OS::memcpy(), ACE_Message_Block::rd_ptr(), IOP::ServiceId, set_context_i(), and ACE_OutputCDR::total_length().

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

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

Definition at line 114 of file Service_Context.cpp.

References add_context_i(), IOP::ServiceContext::context_data, IOP::ServiceContext::context_id, TAO::unbounded_value_sequence< T >::get_buffer(), TAO::unbounded_value_sequence< T >::length(), TAO::unbounded_value_sequence< ServiceContext >::length(), TAO::unbounded_value_sequence< T >::maximum(), and TAO::unbounded_value_sequence< ServiceContext >::replace().

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

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

Helper methods to implement set_context().

Definition at line 97 of file Service_Context.cpp.

References add_context_i(), IOP::ServiceContext::context_id, and TAO::unbounded_value_sequence< ServiceContext >::length().

Referenced by set_context(), and set_context_i().

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


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 150 of file Service_Context.h.


The documentation for this class was generated from the following files:
Generated on Thu Nov 9 12:23:35 2006 for TAO by doxygen 1.3.6