TAO_GIOP_Message_Generator_Parser_12 Class Reference

Implementation for GIOP v1.2. More...

#include <GIOP_Message_Generator_Parser_12.h>

Inheritance diagram for TAO_GIOP_Message_Generator_Parser_12:

Inheritance graph
[legend]
Collaboration diagram for TAO_GIOP_Message_Generator_Parser_12:

Collaboration graph
[legend]
List of all members.

Public Member Functions

virtual int write_request_header (const TAO_Operation_Details &opdetails, TAO_Target_Specification &spec, TAO_OutputCDR &msg)
 Write the request header in to msg.

virtual int write_locate_request_header (CORBA::ULong request_id, TAO_Target_Specification &spec, TAO_OutputCDR &msg)
 Write the LocateRequest header.

virtual int write_reply_header (TAO_OutputCDR &output, TAO_Pluggable_Reply_Params_Base &reply) throw (CORBA::SystemException)
 Write the reply header in to output.

virtual int write_locate_reply_mesg (TAO_OutputCDR &output, CORBA::ULong request_id, TAO_GIOP_Locate_Status_Msg &status)
 Writes the locate _reply message in to the output.

virtual bool write_fragment_header (TAO_OutputCDR &cdr, CORBA::ULong request_id)
virtual int parse_request_header (TAO_ServerRequest &)
virtual int parse_locate_header (TAO_GIOP_Locate_Request_Header &)
virtual int parse_reply (TAO_InputCDR &input, TAO_Pluggable_Reply_Params &params)
 Parse the reply message.

virtual int parse_locate_reply (TAO_InputCDR &input, TAO_Pluggable_Reply_Params &params)
 Parse the locate reply message.

virtual CORBA::Octet major_version (void)
 Our versions.

virtual CORBA::Octet minor_version (void)
virtual int is_ready_for_bidirectional (void)
virtual size_t fragment_header_length (void) const
 The header length of a fragment.


Private Member Functions

int marshall_target_spec (TAO_Target_Specification &spec, TAO_OutputCDR &msg)
 Marshall the TargetSpecification.

int check_bidirectional_context (TAO_ServerRequest &)
int process_bidir_context (TAO_Service_Context &, TAO_Transport *transport)
 Process the BiDirContext info that we have received.


Detailed Description

Implementation for GIOP v1.2.

Definition at line 37 of file GIOP_Message_Generator_Parser_12.h.


Member Function Documentation

int TAO_GIOP_Message_Generator_Parser_12::check_bidirectional_context TAO_ServerRequest  )  [private]
 

Check whether we have BiDirContext info available. If available delegate the responsibility on to the TAO_Transport classes to initiate action.

Note:
At somepoint this may be needed for future versions of GIOP and we may have to share this

Definition at line 539 of file GIOP_Message_Generator_Parser_12.cpp.

References TAO_Service_Context::is_service_id(), process_bidir_context(), TAO_ServerRequest::request_service_context(), and TAO_ServerRequest::transport().

Referenced by parse_request_header().

00541 {
00542   TAO_Service_Context &service_context = request.request_service_context ();
00543 
00544   // Check whether we have the BiDir service context info available in
00545   // the ServiceContextList
00546   if (service_context.is_service_id (IOP::BI_DIR_IIOP)
00547       == 1)
00548     {
00549       return this->process_bidir_context (service_context,
00550                                           request.transport ());
00551     }
00552 
00553   return 0;
00554 }

size_t TAO_GIOP_Message_Generator_Parser_12::fragment_header_length void   )  const [virtual]
 

The header length of a fragment.

Implements TAO_GIOP_Message_Generator_Parser.

Definition at line 578 of file GIOP_Message_Generator_Parser_12.cpp.

00579 {
00580   return TAO_GIOP_MESSAGE_FRAGMENT_HEADER;
00581 }

int TAO_GIOP_Message_Generator_Parser_12::is_ready_for_bidirectional void   )  [virtual]
 

Is the messaging object ready for processing BiDirectional request/response?

Reimplemented from TAO_GIOP_Message_Generator_Parser.

Definition at line 437 of file GIOP_Message_Generator_Parser_12.cpp.

00438 {
00439   // We do support bidirectional
00440   return 1;
00441 }

CORBA::Octet TAO_GIOP_Message_Generator_Parser_12::major_version void   )  [virtual]
 

Our versions.

Implements TAO_GIOP_Message_Generator_Parser.

Definition at line 424 of file GIOP_Message_Generator_Parser_12.cpp.

00425 {
00426   return (CORBA::Octet) 1;
00427 }

int TAO_GIOP_Message_Generator_Parser_12::marshall_target_spec TAO_Target_Specification spec,
TAO_OutputCDR msg
[private]
 

Marshall the TargetSpecification.

This method may be required for other GIOP versiona coming out later than 1.2. We need to share this method

Definition at line 446 of file GIOP_Message_Generator_Parser_12.cpp.

References ACE_DEBUG, ACE_TEXT, TAO_Target_Specification::iop_ior(), LM_DEBUG, TAO_Target_Specification::object_key(), TAO_Target_Specification::profile(), TAO_Target_Specification::specifier(), and TAO_debug_level.

Referenced by write_locate_request_header(), and write_request_header().

00450 {
00451   switch (spec.specifier ())
00452     {
00453     case TAO_Target_Specification::Key_Addr:
00454       {
00455         // As this is a union send in the discriminant first
00456         msg << GIOP::KeyAddr;
00457 
00458         // Get the object key
00459         const TAO::ObjectKey *key = spec.object_key ();
00460 
00461         if (key)
00462           {
00463             // Marshall in the object key
00464             msg << *key;
00465           }
00466         else
00467           {
00468             if (TAO_debug_level)
00469               ACE_DEBUG ((LM_DEBUG,
00470                           ACE_TEXT ("(%N |%l) Unable to handle this request \n")));
00471             return 0;
00472           }
00473         break;
00474       }
00475     case TAO_Target_Specification::Profile_Addr:
00476       {
00477         // As this is a union send in the discriminant first
00478         msg << GIOP::ProfileAddr;
00479 
00480         // Get the profile
00481         const IOP::TaggedProfile *pfile = spec.profile ();
00482 
00483         if (pfile)
00484           {
00485             // Marshall in the object key
00486             msg << *pfile;
00487           }
00488         else
00489           {
00490             if (TAO_debug_level)
00491               ACE_DEBUG ((LM_DEBUG,
00492                           ACE_TEXT ("(%N |%l) Unable to handle this request \n")));
00493             return 0;
00494           }
00495         break;
00496       }
00497     case TAO_Target_Specification::Reference_Addr:
00498       {
00499         // As this is a union send in the discriminant first
00500         msg << GIOP::ReferenceAddr;
00501 
00502         // Get the IOR
00503         IOP::IOR *ior;
00504         CORBA::ULong index = spec.iop_ior (ior);
00505 
00506         if (ior)
00507           {
00508             // This is a struct IORAddressingInfo. So, marshall each
00509             // member of the struct one after another in the order
00510             // defined.
00511             msg << index;
00512             msg << *ior;
00513           }
00514         else
00515           {
00516             if (TAO_debug_level)
00517               {
00518                 ACE_DEBUG ((LM_DEBUG,
00519                             ACE_TEXT ("(%N |%l) Unable to handle this request \n")));
00520               }
00521             return 0;
00522           }
00523         break;
00524       }
00525     default:
00526       if (TAO_debug_level)
00527         {
00528           ACE_DEBUG ((LM_DEBUG,
00529                       ACE_TEXT ("(%N |%l) Unable to handle this request \n")));
00530         }
00531       return 0;
00532     }
00533 
00534   return 1;
00535 }

CORBA::Octet TAO_GIOP_Message_Generator_Parser_12::minor_version void   )  [virtual]
 

Implements TAO_GIOP_Message_Generator_Parser.

Definition at line 431 of file GIOP_Message_Generator_Parser_12.cpp.

00432 {
00433   return (CORBA::Octet) 2;
00434 }

int TAO_GIOP_Message_Generator_Parser_12::parse_locate_header TAO_GIOP_Locate_Request_Header  )  [virtual]
 

Parse the LocateRequest Header from the incoming stream. This will do a version specific parsing of the incoming Request header

Implements TAO_GIOP_Message_Generator_Parser.

Definition at line 342 of file GIOP_Message_Generator_Parser_12.cpp.

References ACE_InputCDR::align_read_ptr(), TAO_GIOP_Locate_Request_Header::incoming_stream(), TAO_GIOP_Locate_Request_Header::profile(), ACE_InputCDR::read_ulong(), TAO_GIOP_Locate_Request_Header::request_id(), TAO_GIOP_MESSAGE_ALIGN_PTR, and TAO_Tagged_Profile::unmarshall_target_address().

00345 {
00346   // Get the stream .
00347   TAO_InputCDR &msg = request.incoming_stream ();
00348 
00349   CORBA::Boolean hdr_status = 1;
00350 
00351   // Get the request id.
00352   CORBA::ULong req_id = 0;
00353   hdr_status = msg.read_ulong (req_id);
00354 
00355   // Store it in the Locate request classes
00356   request.request_id (req_id);
00357 
00358   // Unmarshal the target address field.
00359   hdr_status =
00360     hdr_status && request.profile ().unmarshall_target_address(msg);
00361 
00362   // Reset the pointer to an 8-byte bouns]dary
00363   msg.align_read_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR);
00364 
00365   return hdr_status ? 0 : -1;
00366 }

int TAO_GIOP_Message_Generator_Parser_12::parse_locate_reply TAO_InputCDR input,
TAO_Pluggable_Reply_Params params
[virtual]
 

Parse the locate reply message.

Reimplemented from TAO_GIOP_Message_Generator_Parser.

Definition at line 399 of file GIOP_Message_Generator_Parser_12.cpp.

References TAO_GIOP_Message_Generator_Parser::parse_locate_reply().

00403 {
00404   if (TAO_GIOP_Message_Generator_Parser::parse_locate_reply (cdr,
00405                                                              params) == -1)
00406 
00407     return -1;
00408 
00409   // Note: We dont align the pointer to an 8 byte boundary for a
00410   // locate reply body. This is due to an urgent issue raised by Michi
00411   // in the OMG. I discussed this with Michi today (09/07/2001) and I
00412   // learn that this has been passed. Hence the change..
00413   /*if (cdr.length () > 0)
00414     {
00415       // Align the read pointer on an 8-byte boundary
00416       cdr.align_read_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR);
00417       }*/
00418 
00419   return 0;
00420 }

int TAO_GIOP_Message_Generator_Parser_12::parse_reply TAO_InputCDR input,
TAO_Pluggable_Reply_Params params
[virtual]
 

Parse the reply message.

Reimplemented from TAO_GIOP_Message_Generator_Parser.

Definition at line 369 of file GIOP_Message_Generator_Parser_12.cpp.

References ACE_ERROR, ACE_TEXT, ACE_InputCDR::align_read_ptr(), ACE_InputCDR::length(), LM_ERROR, TAO_GIOP_Message_Generator_Parser::parse_reply(), TAO_Pluggable_Reply_Params_Base::svc_ctx_, and TAO_GIOP_MESSAGE_ALIGN_PTR.

00373 {
00374   if (TAO_GIOP_Message_Generator_Parser::parse_reply (cdr,
00375                                                       params) == -1)
00376 
00377     return -1;
00378 
00379   if ((cdr >> params.svc_ctx_) == 0)
00380     {
00381       // if (TAO_debug_level > 0)
00382         ACE_ERROR ((LM_ERROR,
00383                     ACE_TEXT ("TAO (%P|%t) parse_reply, ")
00384                     ACE_TEXT ("extracting context\n")));
00385 
00386       return -1;
00387     }
00388 
00389   if (cdr.length () > 0)
00390     {
00391       // Align the read pointer on an 8-byte boundary
00392       cdr.align_read_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR);
00393     }
00394 
00395   return 0;
00396 }

int TAO_GIOP_Message_Generator_Parser_12::parse_request_header TAO_ServerRequest  )  [virtual]
 

Parse the Request Header from the incoming stream. This will do a version specific parsing of the incoming Request header

Implements TAO_GIOP_Message_Generator_Parser.

Definition at line 265 of file GIOP_Message_Generator_Parser_12.cpp.

References ACE_InputCDR::align_read_ptr(), TAO_ORB_Core::bidir_giop_policy(), check_bidirectional_context(), ACE_InputCDR::good_bit(), TAO_ServerRequest::incoming(), ACE_InputCDR::length(), CORBA::Octet, TAO_ServerRequest::operation(), TAO_ServerRequest::orb_core(), TAO_ServerRequest::profile(), ACE_InputCDR::rd_ptr(), ACE_InputCDR::read_octet(), ACE_InputCDR::read_ulong(), TAO_ServerRequest::request_id(), TAO_ServerRequest::request_service_info(), TAO_ServerRequest::response_expected(), ACE_InputCDR::skip_bytes(), TAO_ServerRequest::sync_with_server(), TAO_GIOP_MESSAGE_ALIGN_PTR, and TAO_Tagged_Profile::unmarshall_target_address().

00268 {
00269   // Get the input CDR in the request class
00270   TAO_InputCDR & input = *request.incoming ();
00271 
00272   CORBA::Boolean hdr_status = (CORBA::Boolean) input.good_bit ();
00273 
00274   CORBA::ULong req_id = 0;
00275   // Get the rest of the request header ...
00276   hdr_status = hdr_status && input.read_ulong (req_id);
00277 
00278   request.request_id (req_id);
00279 
00280   CORBA::Octet response_flags = CORBA::Octet();
00281   hdr_status = hdr_status && input.read_octet (response_flags);
00282 
00283   request.response_expected ((response_flags > 0));
00284 
00285   // The high bit of the octet has been set if the SyncScope policy
00286   // value is SYNC_WITH_SERVER.
00287   request.sync_with_server ((response_flags == 1));
00288 
00289   // Reserved field
00290   input.skip_bytes (3);
00291 
00292   // Unmarshal the target address field.
00293   hdr_status =
00294     hdr_status && request.profile ().unmarshall_target_address(input);
00295 
00296   CORBA::ULong length = 0;
00297   hdr_status = hdr_status && input.read_ulong (length);
00298 
00299   if (hdr_status)
00300     {
00301       // Do not include NULL character at the end.
00302       // @@ This is not getting demarshaled using the codeset
00303       //    translators!
00304 
00305       // Notice that there are no memory allocations involved
00306       // here!
00307 
00308       request.operation (input.rd_ptr (),
00309                          length - 1,
00310                          0 /* TAO_ServerRequest does NOT own string */);
00311       hdr_status = input.skip_bytes (length);
00312     }
00313 
00314   // Tear out the service context ... we currently ignore it, but it
00315   // should probably be passed to each ORB service as appropriate
00316   // (e.g. transactions, security).
00317   //
00318   // NOTE: As security support kicks in, this is a good place to
00319   // verify a digital signature, if that is required in this security
00320   // environment.  It may be required even when using IPSEC security
00321   // infrastructure.
00322   IOP::ServiceContextList &req_service_info =
00323     request.request_service_info ();
00324 
00325   input >> req_service_info;
00326 
00327   // Check an process if BiDir contexts are available
00328   if (request.orb_core ()->bidir_giop_policy ())
00329     this->check_bidirectional_context (request);
00330 
00331   if (input.length () > 0)
00332     {
00333       // Reset the read_ptr to an 8-byte boundary.
00334       input.align_read_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR);
00335     }
00336 
00337   return hdr_status ? 0 : -1;
00338 }

int TAO_GIOP_Message_Generator_Parser_12::process_bidir_context TAO_Service_Context ,
TAO_Transport transport
[private]
 

Process the BiDirContext info that we have received.

Definition at line 557 of file GIOP_Message_Generator_Parser_12.cpp.

References ACE_ERROR_RETURN, ACE_TEXT, IOP::ServiceContext::context_data, IOP::ServiceContext::context_id, TAO::unbounded_value_sequence< T >::get_buffer(), TAO_Service_Context::get_context(), TAO::unbounded_value_sequence< T >::length(), LM_ERROR, and TAO_Transport::tear_listen_point_list().

Referenced by check_bidirectional_context().

00560 {
00561   // Get the context info
00562   IOP::ServiceContext context;
00563   context.context_id = IOP::BI_DIR_IIOP;
00564 
00565   if (service_context.get_context (context) != 1)
00566       ACE_ERROR_RETURN ((LM_ERROR,
00567                          ACE_TEXT ("(%P|%t) Context info not found \n")),
00568                         -1);
00569 
00570   TAO_InputCDR cdr (reinterpret_cast<const char*> (
00571                       context.context_data.get_buffer ()),
00572                     context.context_data.length ());
00573 
00574   return transport->tear_listen_point_list (cdr);
00575 }

bool TAO_GIOP_Message_Generator_Parser_12::write_fragment_header TAO_OutputCDR cdr,
CORBA::ULong  request_id
[virtual]
 

Write the GIOP fragment message header to the output CDR stream cdr.

Implements TAO_GIOP_Message_Generator_Parser.

Definition at line 253 of file GIOP_Message_Generator_Parser_12.cpp.

00256 {
00257   return (cdr << request_id);
00258 
00259   // No need to align write pointer to an 8 byte boundary since it
00260   // should already be aligned (12 for GIOP messager + 4 for fragment
00261   // header = 16 -- a multiple of 8)
00262 }

int TAO_GIOP_Message_Generator_Parser_12::write_locate_reply_mesg TAO_OutputCDR output,
CORBA::ULong  request_id,
TAO_GIOP_Locate_Status_Msg status
[virtual]
 

Writes the locate _reply message in to the output.

Implements TAO_GIOP_Message_Generator_Parser.

Definition at line 190 of file GIOP_Message_Generator_Parser_12.cpp.

References ACE_DEBUG, ACE_TEXT, TAO_GIOP_Locate_Status_Msg::forward_location_var, TAO_Pseudo_Var_T< T >::in(), LM_DEBUG, CORBA::Object_ptr, TAO_GIOP_Locate_Status_Msg::status, TAO_debug_level, TAO_GIOP_LOC_NEEDS_ADDRESSING_MODE, TAO_GIOP_LOC_SYSTEM_EXCEPTION, TAO_GIOP_OBJECT_FORWARD, TAO_GIOP_OBJECT_FORWARD_PERM, and ACE_OutputCDR::write_ulong().

00195 {
00196   output.write_ulong (request_id);
00197 
00198   // Make the header for the locate request
00199   output.write_ulong (status_info.status);
00200 
00201   // Note: We dont align the pointer to an 8 byte boundary for a
00202   // locate reply body. This is due to an urgent issue raised by Michi
00203   // in the OMG. I discussed this with Michi today (09/07/2001) and I
00204   // learn that this has been passed. Hence the change..
00205   /*
00206   if (status_info.status == TAO_GIOP_OBJECT_FORWARD ||
00207       status_info.status == TAO_GIOP_OBJECT_FORWARD_PERM)
00208     {
00209       // We have to send some data, so align the pointer
00210       if (output.align_write_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR) == -1)
00211         {
00212           return 0;
00213         }
00214     }
00215   */
00216   switch (status_info.status)
00217     {
00218     case TAO_GIOP_OBJECT_FORWARD:
00219 
00220       // More likely than not we will not have this in TAO
00221     case TAO_GIOP_OBJECT_FORWARD_PERM:
00222       {
00223         CORBA::Object_ptr object_ptr =
00224           status_info.forward_location_var.in ();
00225 
00226         if ((output << object_ptr) == 0)
00227         {
00228           if (TAO_debug_level > 0)
00229             {
00230               ACE_DEBUG ((
00231                   LM_DEBUG,
00232                   ACE_TEXT ("TAO (%P|%t|%N|%l) write_locate_reply_mesg-")
00233                   ACE_TEXT (" cannot marshal object reference\n")
00234                 ));
00235             }
00236         }
00237       }
00238       break;
00239     case TAO_GIOP_LOC_SYSTEM_EXCEPTION:
00240     case TAO_GIOP_LOC_NEEDS_ADDRESSING_MODE:
00241       // Do we do these in TAO??
00242       // What to do here???? I dont really know. I have to do a survey
00243       // of the specifications that uses this.
00244       break;
00245     default:
00246       break;
00247     }
00248 
00249   return 1;
00250 }

int TAO_GIOP_Message_Generator_Parser_12::write_locate_request_header CORBA::ULong  request_id,
TAO_Target_Specification spec,
TAO_OutputCDR msg
[virtual]
 

Write the LocateRequest header.

Implements TAO_GIOP_Message_Generator_Parser.

Definition at line 98 of file GIOP_Message_Generator_Parser_12.cpp.

References marshall_target_spec().

00103 {
00104   // Write the request id
00105   msg << request_id;
00106 
00107   // Write the target address
00108   if (this->marshall_target_spec (spec,
00109                                   msg) == 0)
00110     return 0;
00111 
00112   // I dont think we need to align the pointer to an 8 byte boundary
00113   // here.
00114   // We need to align the pointer
00115   //  if (msg.align_write_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR) == -1)
00116   //  return 0;
00117 
00118   // Return success
00119   return 1;
00120 }

int TAO_GIOP_Message_Generator_Parser_12::write_reply_header TAO_OutputCDR output,
TAO_Pluggable_Reply_Params_Base reply
throw (CORBA::SystemException) [virtual]
 

Write the reply header in to output.

Implements TAO_GIOP_Message_Generator_Parser.

Definition at line 123 of file GIOP_Message_Generator_Parser_12.cpp.

References TAO::unbounded_value_sequence< ServiceContext >::length(), TAO_GIOP_LOC_NEEDS_ADDRESSING_MODE, TAO_GIOP_LOCATION_FORWARD_PERM, TAO_GIOP_MESSAGE_ALIGN_PTR, TAO_PLUGGABLE_MESSAGE_LOCATION_FORWARD_PERM, and TAO_PLUGGABLE_MESSAGE_NEEDS_ADDRESSING_MODE.

00129 {
00130   // Write the request ID
00131   output.write_ulong (reply.request_id_);
00132 
00133    // Write the reply status
00134   if (reply.reply_status_ ==
00135       TAO_PLUGGABLE_MESSAGE_LOCATION_FORWARD_PERM)
00136     {
00137       // Not sure when we will use this.
00138       output.write_ulong (TAO_GIOP_LOCATION_FORWARD_PERM);
00139     }
00140   else if (reply.reply_status_ ==
00141            TAO_PLUGGABLE_MESSAGE_NEEDS_ADDRESSING_MODE)
00142     {
00143       // Not sure when we will use this.
00144       output.write_ulong (TAO_GIOP_LOC_NEEDS_ADDRESSING_MODE);
00145     }
00146   else
00147     {
00148       this->marshal_reply_status (output,
00149                                   reply);
00150     }
00151 
00152 #if (TAO_HAS_MINIMUM_CORBA == 1)
00153   output << reply.service_context_notowned ();
00154 #else
00155   if (reply.is_dsi_ == 0)
00156     {
00157       output << reply.service_context_notowned ();
00158     }
00159   else
00160     {
00161       IOP::ServiceContextList &svc_ctx =
00162         reply.service_context_notowned ();
00163       CORBA::ULong l = svc_ctx.length ();
00164 
00165       // Now marshal the rest of the service context objects
00166       output << l;
00167 
00168       for (CORBA::ULong i = 0; i != l; ++i)
00169         {
00170           output << svc_ctx[i];
00171         }
00172 
00173     }
00174 #endif /*TAO_HAS_MINIMUM_CORBA */
00175 
00176   if (reply.argument_flag_)
00177     {
00178       // If we have some data to be marshalled, then we align the
00179       // pointer to a 8 byte boundary.  Else, we just leave it throu
00180       if (output.align_write_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR) == -1)
00181         {
00182           return 0;
00183         }
00184     }
00185   return 1;
00186 }

TAO_BEGIN_VERSIONED_NAMESPACE_DECL int TAO_GIOP_Message_Generator_Parser_12::write_request_header const TAO_Operation_Details opdetails,
TAO_Target_Specification spec,
TAO_OutputCDR msg
[virtual]
 

Write the request header in to msg.

Implements TAO_GIOP_Message_Generator_Parser.

Definition at line 27 of file GIOP_Message_Generator_Parser_12.cpp.

References ACE_OutputCDR::align_write_ptr(), TAO_Operation_Details::argument_flag(), marshall_target_spec(), CORBA::Octet, TAO_Operation_Details::opname(), TAO_Operation_Details::opname_len(), TAO_Operation_Details::request_id(), TAO_Operation_Details::request_service_info(), TAO_Operation_Details::response_flags(), TAO_GIOP_MESSAGE_ALIGN_PTR, TAO_TWOWAY_RESPONSE_FLAG, ACE_OutputCDR::write_octet_array(), and ACE_OutputCDR::write_string().

00032 {
00033   // First the request id
00034   msg << opdetails.request_id ();
00035 
00036   const CORBA::Octet response_flags = opdetails.response_flags ();
00037 
00038 
00039   // Here are the Octet values for different policies
00040   // '00000000' for SYNC_NONE
00041   // '00000000' for SYNC_WITH_TRANSPORT
00042   // '00000010' for SYNC_WITH_SERVER
00043   // '00000011' for SYNC_WITH_TARGET
00044   // '00000011' for regular two ways, but if they are invoked via a
00045   // DII with INV_NO_RESPONSE flag set then we need to send '00000001'
00046   //
00047   // We have not implemented the policy INV_NO_RESPONSE for DII.
00048   if (response_flags == TAO_TWOWAY_RESPONSE_FLAG)
00049     msg << ACE_OutputCDR::from_octet (3);
00050   // Second the response flags
00051   // Sync scope - ignored by server if request is not oneway.
00052   else if (response_flags == CORBA::Octet (Messaging::SYNC_NONE)
00053            || response_flags == CORBA::Octet (Messaging::SYNC_WITH_TRANSPORT)
00054            || response_flags == CORBA::Octet (TAO::SYNC_EAGER_BUFFERING)
00055            || response_flags == CORBA::Octet (TAO::SYNC_DELAYED_BUFFERING))
00056     // No response required.
00057     msg << ACE_OutputCDR::from_octet (0);
00058 
00059   else if (response_flags == CORBA::Octet (Messaging::SYNC_WITH_SERVER))
00060     // Return before dispatching to the servant
00061     msg << ACE_OutputCDR::from_octet (1);
00062 
00063   else if (response_flags == CORBA::Octet (Messaging::SYNC_WITH_TARGET))
00064     // Return after dispatching servant.
00065     msg << ACE_OutputCDR::from_octet (3);
00066   else
00067     // Until more flags are defined by the OMG.
00068     return 0;
00069 
00070   // The reserved field
00071   CORBA::Octet reserved[3] = {0, 0, 0};
00072 
00073   msg.write_octet_array (reserved, 3);
00074 
00075   if (this->marshall_target_spec (spec,
00076                                   msg) == 0)
00077     return 0;
00078 
00079   // Write the operation name
00080   msg.write_string (opdetails.opname_len (),
00081                     opdetails.opname ());
00082 
00083   // Write the service context list
00084   msg << opdetails.request_service_info ();
00085 
00086   // We align the pointer only if the operation has arguments.
00087   if (opdetails.argument_flag ()
00088       && msg.align_write_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR) == -1)
00089     {
00090       return 0;
00091     }
00092 
00093   return 1;
00094 }


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