#include <Service_Context.h>
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_Context & | operator= (const TAO_Service_Context &) |
Private Attributes | |
IOP::ServiceContextList | service_context_ |
The ServiceContextList info. | |
Friends | |
class | TAO::CSD::FW_Server_Request_Wrapper |
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
Definition at line 60 of file Service_Context.h.
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] |
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 |
int TAO_Service_Context::get_context | ( | IOP::ServiceId | id, | |
IOP::ServiceContext_out | context | |||
) |
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 |
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 }
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.
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().