TAO_GIOP_Message_Lite Class Reference

Definitions of GIOPLite specific stuff. More...

#include <GIOP_Message_Lite.h>

Inheritance diagram for TAO_GIOP_Message_Lite:

Inheritance graph
[legend]
Collaboration diagram for TAO_GIOP_Message_Lite:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 TAO_GIOP_Message_Lite (TAO_ORB_Core *orb_core, size_t input_cdr_size=ACE_CDR::DEFAULT_BUFSIZE)
 Constructor.

virtual ~TAO_GIOP_Message_Lite (void)
 Dtor.

virtual void init (CORBA::Octet, CORBA::Octet)
 Initialize the object -- this is a dummy for GIOPlite.

virtual void reset (void)
 Reset the messaging the object.

virtual int generate_request_header (TAO_Operation_Details &op, TAO_Target_Specification &spec, TAO_OutputCDR &cdr)
virtual int generate_locate_request_header (TAO_Operation_Details &op, TAO_Target_Specification &spec, TAO_OutputCDR &cdr)
 Write the RequestHeader in to the cdr stream.

virtual int generate_reply_header (TAO_OutputCDR &cdr, TAO_Pluggable_Reply_Params_Base &params)
 Write the reply header.

virtual int generate_fragment_header (TAO_OutputCDR &cdr, CORBA::ULong request_id)
virtual int format_message (TAO_OutputCDR &cdr)
virtual int parse_next_message (ACE_Message_Block &incoming, TAO_Queued_Data &qd, size_t &mesg_length)
virtual int extract_next_message (ACE_Message_Block &incoming, TAO_Queued_Data *&qd)
virtual int consolidate_node (TAO_Queued_Data *qd, ACE_Message_Block &incoming)
 Check whether the node qd needs consolidation from incoming.

virtual int process_request_message (TAO_Transport *transport, TAO_Queued_Data *qd)
virtual int process_reply_message (TAO_Pluggable_Reply_Params &reply_info, TAO_Queued_Data *qd)
virtual int generate_exception_reply (TAO_OutputCDR &cdr, TAO_Pluggable_Reply_Params_Base &params, CORBA::Exception &x)
 Generate a reply message with the exception ex.

virtual int consolidate_fragmented_message (TAO_Queued_Data *qd, TAO_Queued_Data *&msg)
virtual int discard_fragmented_message (const TAO_Queued_Data *cancel_request)
virtual TAO_GIOP_Fragmentation_Strategyfragmentation_strategy (void)
 Outgoing GIOP message fragmentation strategy.


Private Member Functions

int parse_incoming_messages (ACE_Message_Block &message_block)
TAO_Pluggable_Message_Type message_type (void) const
int write_protocol_header (TAO_GIOP_Message_Type t, TAO_OutputCDR &msg)
int process_request (TAO_Transport *transport, TAO_InputCDR &input, TAO_OutputCDR &output)
 Processes the GIOP_REQUEST messages.

int process_locate_request (TAO_Transport *transport, TAO_InputCDR &input, TAO_OutputCDR &output)
 Processes the GIOP_LOCATE_REQUEST messages.

int make_send_locate_reply (TAO_Transport *transport, TAO_OutputCDR &output, TAO_GIOP_Locate_Request_Header &request, TAO_GIOP_Locate_Status_Msg &status)
int send_error (TAO_Transport *transport)
 Send error messages.

void send_close_connection (const TAO_GIOP_Message_Version &version, TAO_Transport *transport, void *ctx)
 Close a connection, first sending GIOP::CloseConnection.

int send_reply_exception (TAO_Transport *transport, TAO_ORB_Core *orb_core, CORBA::ULong request_id, IOP::ServiceContextList *svc_info, CORBA::Exception *x)
void dump_msg (const char *label, const u_char *ptr, size_t len)
 Print out a debug messages..

TAO_Queued_Datamake_queued_data (size_t sz)
virtual int generate_locate_reply_header (TAO_OutputCDR &, TAO_Pluggable_Reply_Params_Base &)
 Write the locate reply header.

virtual int is_ready_for_bidirectional (TAO_OutputCDR &msg)
virtual size_t header_length (void) const
 Header length.

virtual size_t fragment_header_length (CORBA::Octet major, CORBA::Octet minor) const
 Fragment header length.

virtual TAO_OutputCDRout_stream (void)
 Accessor for the output CDR stream.

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

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

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

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 .

int parse_request_header (TAO_ServerRequest &)
int parse_locate_header (TAO_GIOP_Locate_Request_Header &)
int parse_reply (TAO_InputCDR &input, TAO_Pluggable_Reply_Params &params)
 Parse the reply message.

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

void init_queued_data (TAO_Queued_Data *qd) const
 Initialize the relevant portions of a TAO_Queued_Data.


Private Attributes

TAO_ORB_Coreorb_core_
 Our copy of the ORB core...

CORBA::Octet message_type_
 The message type that we are going to process..

CORBA::ULong message_size_
 The pay load size.

CORBA::Octet byte_order_
TAO_OutputCDR cdr_

Detailed Description

Definitions of GIOPLite specific stuff.

This protocol is a modified version of GIOP. This is more suited for homogenous platforms.

Definition at line 47 of file GIOP_Message_Lite.h.


Constructor & Destructor Documentation

TAO_BEGIN_VERSIONED_NAMESPACE_DECL TAO_GIOP_Message_Lite::TAO_GIOP_Message_Lite TAO_ORB_Core orb_core,
size_t  input_cdr_size = ACE_CDR::DEFAULT_BUFSIZE
 

Constructor.

Definition at line 27 of file GIOP_Message_Lite.cpp.

References TAO_ENCAP_BYTE_ORDER.

00029   : orb_core_ (orb_core),
00030     message_type_ (0),
00031     message_size_ (0),
00032     byte_order_ (TAO_ENCAP_BYTE_ORDER)
00033 {
00034 }

TAO_GIOP_Message_Lite::~TAO_GIOP_Message_Lite void   )  [virtual]
 

Dtor.

Definition at line 37 of file GIOP_Message_Lite.cpp.

00038 {
00039 }


Member Function Documentation

int TAO_GIOP_Message_Lite::consolidate_fragmented_message TAO_Queued_Data qd,
TAO_Queued_Data *&  msg
[virtual]
 

Consolidate fragmented message with associated fragments, being stored withi this class. If reliable transport is used (like TCP) fragments are partialy ordered on stack, last fragment on top. Otherwise If un-reliable transport is used (like UDP) fragments may be dis-ordered, and must be ordered before consolidation.

Returns:
0 on success and msg points to consolidated message, 1 if there are still fragmens outstanding, in case of error -1 is being returned. In any case qd must be released by method implementation.

Implements TAO_Pluggable_Messaging.

Definition at line 1761 of file GIOP_Message_Lite.cpp.

References ACE_ERROR, ACE_TEXT, LM_ERROR, and TAO_debug_level.

01763 {
01764   if (TAO_debug_level > 3)
01765     {
01766       ACE_ERROR ((LM_ERROR,
01767                   ACE_TEXT ("(%P | %t):%s GIOP lite msg, ")
01768                   ACE_TEXT ("Error, fragmented messages not supported\n")));
01769     }
01770   return -1; // not implemented, not supported
01771 }

int TAO_GIOP_Message_Lite::consolidate_node TAO_Queued_Data qd,
ACE_Message_Block incoming
[virtual]
 

Check whether the node qd needs consolidation from incoming.

Implements TAO_Pluggable_Messaging.

Definition at line 423 of file GIOP_Message_Lite.cpp.

References ace_min(), ACE_Message_Block::copy(), ACE_CDR::grow(), init_queued_data(), ACE_Message_Block::length(), message_size_, TAO_Queued_Data::missing_data_, TAO_Queued_Data::msg_block_, parse_incoming_messages(), ACE_Message_Block::rd_ptr(), TAO_GIOP_LITE_HEADER_LEN, and TAO_MISSING_DATA_UNDEFINED.

00425 {
00426   // Look to see whether we had atleast parsed the GIOP header ...
00427   if (qd->missing_data_ == TAO_MISSING_DATA_UNDEFINED)
00428     {
00429       // The data length that has been stuck in there during the last
00430       // read ....
00431       size_t len =
00432         qd->msg_block_->length ();
00433 
00434       // We know that we would have space for
00435       // TAO_GIOP_MESSAGE_HEADER_LEN here.  So copy that much of data
00436       // from the <incoming> into the message block in <qd>
00437       const size_t available     = incoming.length ();
00438       const size_t desired       = TAO_GIOP_LITE_HEADER_LEN - len;
00439       const size_t n_copy        = ace_min (available, desired);
00440 
00441       // paranoid check, but would cause endless loop
00442       if (n_copy == 0)
00443         {
00444           return -1;
00445         }
00446 
00447       qd->msg_block_->copy (incoming.rd_ptr (), n_copy);
00448 
00449       // Move the rd_ptr () in the incoming message block..
00450       incoming.rd_ptr (n_copy);
00451 
00452       // verify there is now enough data to parse the header
00453       if (qd->msg_block_->length () < TAO_GIOP_LITE_HEADER_LEN)
00454         {
00455           return 0;
00456         }
00457 
00458       // Parse the message header now...
00459       if (this->parse_incoming_messages (*qd->msg_block_) == -1)
00460         return -1;
00461 
00462       // Now grow the message block so that we can copy the rest of
00463       // the data...
00464       if (ACE_CDR::grow (qd->msg_block_,
00465                      this->message_size_ + TAO_GIOP_LITE_HEADER_LEN) == -1)
00466         {
00467           /* memory allocation failed */
00468           return -1;
00469         }
00470 
00471       // Copy the pay load..
00472 
00473       // Calculate the bytes that needs to be copied in the queue...
00474       size_t copy_len = this->message_size_;
00475 
00476       // If the data that needs to be copied is more than that is
00477       // available to us ..
00478       if (copy_len > incoming.length ())
00479         {
00480           // Calculate the missing data..
00481           qd->missing_data_ = copy_len - incoming.length ();
00482 
00483           // Set the actual possible copy_len that is available...
00484           copy_len = incoming.length ();
00485         }
00486       else
00487         {
00488           qd->missing_data_ = 0;
00489         }
00490 
00491       // paranoid check
00492       if (copy_len == 0)
00493         {
00494           return -1;
00495         }
00496 
00497       // ..now we are set to copy the right amount of data to the
00498       // node..
00499       qd->msg_block_->copy (incoming.rd_ptr (),
00500                             copy_len);
00501 
00502       // Set the <rd_ptr> of the <incoming>..
00503       incoming.rd_ptr (copy_len);
00504 
00505       // Get the other details...
00506       this->init_queued_data (qd);
00507     }
00508   else
00509     {
00510       // @@todo: Need to abstract this out to a seperate method...
00511       size_t copy_len = qd->missing_data_;
00512 
00513       if (copy_len > incoming.length ())
00514         {
00515           // Calculate the missing data..
00516           qd->missing_data_ = copy_len - incoming.length ();
00517 
00518           // Set the actual possible copy_len that is available...
00519           copy_len = incoming.length ();
00520         }
00521 
00522       // Copy the right amount of data in to the node...
00523       // node..
00524       qd->msg_block_->copy (incoming.rd_ptr (),
00525                             copy_len);
00526 
00527       // Set the <rd_ptr> of the <incoming>..
00528       qd->msg_block_->rd_ptr (copy_len);
00529 
00530     }
00531 
00532   return 0;
00533 }

int TAO_GIOP_Message_Lite::discard_fragmented_message const TAO_Queued_Data cancel_request  )  [virtual]
 

Discard all fragments associated to request-id encoded in cancel_request. This operation will never be called concurrently by multiplpe threads nor concurrently to consolidate_fragmented_message 0 on success, 1 if no matching fragment chain exists, -1 on error

Implements TAO_Pluggable_Messaging.

Definition at line 1779 of file GIOP_Message_Lite.cpp.

01780 {
01781   return 1; // no fragment on stack relating to cancel-request
01782 }

void TAO_GIOP_Message_Lite::dump_msg const char *  label,
const u_char *  ptr,
size_t  len
[private]
 

Print out a debug messages..

Definition at line 1608 of file GIOP_Message_Lite.cpp.

References ACE_DEBUG, ACE_HEX_DUMP, ACE_ptr_align_binary, ACE_TEXT, ACE_TEXT_CHAR_TO_TCHAR, LM_DEBUG, names, TAO_debug_level, TAO_ENCAP_BYTE_ORDER, TAO_GIOP_LITE_HEADER_LEN, TAO_GIOP_LITE_MESSAGE_TYPE_OFFSET, TAO_GIOP_REPLY, and TAO_GIOP_REQUEST.

Referenced by format_message(), process_reply_message(), process_request_message(), and send_error().

01611 {
01612   if (TAO_debug_level >= 5)
01613     {
01614       static const char *names [] =
01615       {
01616         "Request",
01617         "Reply",
01618         "CancelRequest",
01619         "LocateRequest",
01620         "LocateReply",
01621         "CloseConnection",
01622         "MessageError",
01623         "Fragment"
01624       };
01625 
01626       // Message name.
01627       const char *message_name = "UNKNOWN MESSAGE";
01628       u_long slot = ptr[TAO_GIOP_LITE_MESSAGE_TYPE_OFFSET];
01629 
01630       if (slot < sizeof (names)/sizeof(names[0]))
01631         {
01632           message_name = names [slot];
01633         }
01634 
01635       // Byte order.
01636       int byte_order = TAO_ENCAP_BYTE_ORDER;
01637 
01638       // request/reply id.
01639       CORBA::ULong tmp = 0;
01640       CORBA::ULong *id = &tmp;
01641 
01642       if (ptr[TAO_GIOP_LITE_MESSAGE_TYPE_OFFSET] == TAO_GIOP_REQUEST ||
01643           ptr[TAO_GIOP_LITE_MESSAGE_TYPE_OFFSET] == TAO_GIOP_REPLY)
01644         {
01645           // We are not sure where the read pointer is pointing
01646           // to. So, try to align teh pointer to a 4 byte boundary.
01647           char *buf = ACE_ptr_align_binary (ptr + TAO_GIOP_LITE_HEADER_LEN, 4);
01648 
01649           id = reinterpret_cast <CORBA::ULong *> (buf);
01650         }
01651 
01652       // Print.
01653       ACE_DEBUG ((LM_DEBUG,
01654                   ACE_TEXT ("(%P | %t):%s GIOP lite msg, ")
01655                   ACE_TEXT ("%d data bytes, %s endian, <%s = %d> \n"),
01656                   ACE_TEXT_CHAR_TO_TCHAR(label),
01657                   len - TAO_GIOP_LITE_HEADER_LEN,
01658                   (byte_order == TAO_ENCAP_BYTE_ORDER) ? ACE_TEXT("my") : ACE_TEXT("other"),
01659                   ACE_TEXT_CHAR_TO_TCHAR (message_name),
01660                   *id));
01661 
01662       if (TAO_debug_level >= 10)
01663         ACE_HEX_DUMP ((LM_DEBUG,
01664                        (const char *) ptr,
01665                        len,
01666                        ACE_TEXT ("GIOP lite message")));
01667     }
01668 }

int TAO_GIOP_Message_Lite::extract_next_message ACE_Message_Block incoming,
TAO_Queued_Data *&  qd
[virtual]
 

Extract the details of the next message from the incoming through qd. Returns 0 if the message header could not be parsed completely, returns a 1 if the message header could be parsed completely and returns -1 on error.

Implements TAO_Pluggable_Messaging.

Definition at line 363 of file GIOP_Message_Lite.cpp.

References ACE_Message_Block::copy(), init_queued_data(), ACE_Message_Block::length(), make_queued_data(), message_size_, TAO_Queued_Data::missing_data_, TAO_Queued_Data::msg_block_, parse_incoming_messages(), ACE_Message_Block::rd_ptr(), TAO_GIOP_LITE_HEADER_LEN, and TAO_MISSING_DATA_UNDEFINED.

00365 {
00366   if (incoming.length () < TAO_GIOP_LITE_HEADER_LEN)
00367     {
00368       if (incoming.length () > 0)
00369         {
00370           // Make a node which has a message block of the size of
00371           // MESSAGE_HEADER_LEN.
00372           qd =
00373             this->make_queued_data (TAO_GIOP_LITE_HEADER_LEN);
00374 
00375           if (qd == 0)
00376             {
00377               return -1; /* out of memory */
00378             }
00379 
00380             qd->msg_block_->copy (incoming.rd_ptr (),
00381                                   incoming.length ());
00382           qd->missing_data_ = TAO_MISSING_DATA_UNDEFINED;
00383         }
00384       return 0;
00385     }
00386 
00387   if (this->parse_incoming_messages (incoming) == -1)
00388     {
00389       return -1;
00390     }
00391 
00392   size_t copying_len =
00393     this->message_size_ + TAO_GIOP_LITE_HEADER_LEN;
00394 
00395   qd = this->make_queued_data (copying_len);
00396 
00397   if (qd == 0)
00398     {
00399       return -1; /* out of memory */
00400     }
00401 
00402   if (copying_len > incoming.length ())
00403     {
00404       qd->missing_data_ = copying_len - incoming.length ();
00405 
00406       copying_len = incoming.length ();
00407     }
00408   else
00409     {
00410       qd->missing_data_ = 0;
00411     }
00412 
00413   qd->msg_block_->copy (incoming.rd_ptr (),
00414                         copying_len);
00415 
00416   incoming.rd_ptr (copying_len);
00417   this->init_queued_data (qd);
00418 
00419   return 1;
00420 }

int TAO_GIOP_Message_Lite::format_message TAO_OutputCDR cdr  )  [virtual]
 

Format the message. As we have not written the message length in the header, we make use of this oppurtunity to insert and format the message.

Implements TAO_Pluggable_Messaging.

Definition at line 177 of file GIOP_Message_Lite.cpp.

References ACE_OutputCDR::begin(), ACE_OutputCDR::buffer(), ACE_CDR::consolidate(), ACE_Message_Block::cont(), ACE_OutputCDR::do_byte_swap(), dump_msg(), ACE_OutputCDR::length(), ACE_Message_Block::rd_ptr(), ACE_CDR::swap_4(), TAO_debug_level, TAO_GIOP_LITE_HEADER_LEN, TAO_GIOP_LITE_MESSAGE_SIZE_OFFSET, and ACE_OutputCDR::total_length().

00178 {
00179   // Get the header length
00180   const size_t header_len = TAO_GIOP_LITE_HEADER_LEN;
00181 
00182   // Get the message size offset
00183   const size_t offset = TAO_GIOP_LITE_MESSAGE_SIZE_OFFSET;
00184 
00185   // Ptr to first buffer.
00186   char *buf = (char *) stream.buffer ();
00187 
00188   // Length of all buffers.
00189   size_t total_len =
00190     stream.total_length ();
00191 
00192   // NOTE: Here would also be a fine place to calculate a digital
00193   // signature for the message and place it into a preallocated slot
00194   // in the "ServiceContext".  Similarly, this is a good spot to
00195   // encrypt messages (or just the message bodies) if that's needed in
00196   // this particular environment and that isn't handled by the
00197   // networking infrastructure (e.g., IPSEC).
00198 
00199   CORBA::ULong bodylen = static_cast <CORBA::ULong> (total_len - header_len);
00200 
00201 #if !defined (ACE_ENABLE_SWAP_ON_WRITE)
00202   *(reinterpret_cast <CORBA::ULong *> (buf + offset)) = bodylen;
00203 #else
00204   if (!stream.do_byte_swap ())
00205     *(reinterpret_cast <CORBA::ULong *>
00206                            (buf + offset)) = bodylen;
00207   else
00208     ACE_CDR::swap_4 (reinterpret_cast <char *> (&bodylen),
00209                      buf + offset);
00210 #endif /* ACE_ENABLE_SWAP_ON_WRITE */
00211 
00212   // Strictly speaking, should not need to loop here because the
00213   // socket never gets set to a nonblocking mode ... some Linux
00214   // versions seem to need it though.  Leaving it costs little.
00215   if (TAO_debug_level > 2)
00216     {
00217       // Check whether the output cdr stream is build up of multiple
00218       // messageblocks. If so, consolidate them to one block that can be
00219       // dumped
00220       ACE_Message_Block* consolidated_block = 0;
00221       if (stream.begin()->cont() != 0)
00222         {
00223           consolidated_block = new ACE_Message_Block;
00224           ACE_CDR::consolidate(consolidated_block, stream.begin());
00225           buf = (char *) (consolidated_block->rd_ptr ());
00226         }
00227       ///
00228 
00229       this->dump_msg ("send",
00230                       reinterpret_cast <u_char *> (buf),
00231                       stream.length ());
00232 
00233       //
00234       delete consolidated_block;
00235       consolidated_block = 0;
00236       //
00237     }
00238 
00239   return 0;
00240 }

size_t TAO_GIOP_Message_Lite::fragment_header_length CORBA::Octet  major,
CORBA::Octet  minor
const [private, virtual]
 

Fragment header length.

Implements TAO_Pluggable_Messaging.

Definition at line 1744 of file GIOP_Message_Lite.cpp.

01746 {
01747   return 0;
01748 }

TAO_GIOP_Fragmentation_Strategy * TAO_GIOP_Message_Lite::fragmentation_strategy void   )  [virtual]
 

Outgoing GIOP message fragmentation strategy.

Implements TAO_Pluggable_Messaging.

Definition at line 1785 of file GIOP_Message_Lite.cpp.

01786 {
01787   return 0; // Fragmentation is unsupported in GIOP lite.
01788 }

int TAO_GIOP_Message_Lite::generate_exception_reply TAO_OutputCDR cdr,
TAO_Pluggable_Reply_Params_Base params,
CORBA::Exception x
[virtual]
 

Generate a reply message with the exception ex.

Implements TAO_Pluggable_Messaging.

Definition at line 673 of file GIOP_Message_Lite.cpp.

References CORBA::Exception::_tao_encode(), ACE_CATCH, ACE_CHECK_RETURN, ACE_DEBUG, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_TEXT, ACE_TRY, ACE_TRY_CHECK, LM_DEBUG, and write_reply_header().

00678 {
00679   // A new try/catch block, but if something goes wrong now we have no
00680   // hope, just abort.
00681   ACE_DECLARE_NEW_CORBA_ENV;
00682 
00683   ACE_TRY
00684     {
00685       // Make the GIOP & reply header. They are version specific.
00686       this->write_reply_header (cdr,
00687                                 params);
00688       x._tao_encode (cdr ACE_ENV_ARG_PARAMETER);
00689       ACE_TRY_CHECK;
00690     }
00691   ACE_CATCH (CORBA::Exception, ex)
00692     {
00693       // Now we know that while handling the error an other error
00694       // happened -> no hope, close connection.
00695 
00696       // Close the handle.
00697       ACE_DEBUG ((LM_DEBUG,
00698                   ACE_TEXT ("(%P|%t|%N|%l) cannot marshal exception, ")
00699                   ACE_TEXT ("generate_exception_reply ()\n")));
00700       return -1;
00701     }
00702   ACE_ENDTRY;
00703   ACE_CHECK_RETURN (-1);
00704 
00705   return 0;
00706 }

int TAO_GIOP_Message_Lite::generate_fragment_header TAO_OutputCDR cdr,
CORBA::ULong  request_id
[virtual]
 

Implements TAO_Pluggable_Messaging.

Definition at line 169 of file GIOP_Message_Lite.cpp.

00171 {
00172   // GIOP fragmentation is not supported in GIOP lite.
00173   return 0;
00174 }

int TAO_GIOP_Message_Lite::generate_locate_reply_header TAO_OutputCDR ,
TAO_Pluggable_Reply_Params_Base
[private, virtual]
 

Write the locate reply header.

Implements TAO_Pluggable_Messaging.

Definition at line 1722 of file GIOP_Message_Lite.cpp.

01725 {
01726   return 0;
01727 }

int TAO_GIOP_Message_Lite::generate_locate_request_header TAO_Operation_Details op,
TAO_Target_Specification spec,
TAO_OutputCDR cdr
[virtual]
 

Write the RequestHeader in to the cdr stream.

Implements TAO_Pluggable_Messaging.

Definition at line 100 of file GIOP_Message_Lite.cpp.

References ACE_ERROR, ACE_TEXT, LM_ERROR, TAO_Operation_Details::request_id(), TAO_debug_level, TAO_GIOP_LOCATEREQUEST, write_locate_request_header(), and write_protocol_header().

00105 {
00106   // Write the GIOPLite header first
00107   if (!this->write_protocol_header (TAO_GIOP_LOCATEREQUEST,
00108                                     cdr))
00109     {
00110       if (TAO_debug_level)
00111         {
00112           ACE_ERROR ((LM_ERROR,
00113                       ACE_TEXT ("(%P|%t) Error in writing GIOPLite header \n")));
00114         }
00115 
00116       return -1;
00117     }
00118 
00119   // Now call the implementation for the rest of the header
00120   if (!this->write_locate_request_header (op.request_id (),
00121                                           spec,
00122                                           cdr))
00123     {
00124       if (TAO_debug_level)
00125         ACE_ERROR ((LM_ERROR,
00126                     ACE_TEXT ("(%P|%t) Error in writing locate request header \n")));
00127 
00128       return -1;
00129     }
00130 
00131   return 0;
00132 }

int TAO_GIOP_Message_Lite::generate_reply_header TAO_OutputCDR cdr,
TAO_Pluggable_Reply_Params_Base params
[virtual]
 

Write the reply header.

Implements TAO_Pluggable_Messaging.

Definition at line 136 of file GIOP_Message_Lite.cpp.

References ACE_ERROR, ACE_TEXT, LM_ERROR, TAO_debug_level, TAO_GIOP_REPLY, write_protocol_header(), and write_reply_header().

Referenced by process_request().

00140 {
00141   // Write the GIOPLite header first
00142   if (!this->write_protocol_header (TAO_GIOP_REPLY,
00143                                     cdr))
00144     {
00145       if (TAO_debug_level)
00146         {
00147           ACE_ERROR ((LM_ERROR,
00148                       ACE_TEXT ("(%P|%t) Error in writing GIOPLite header \n")));
00149         }
00150 
00151       return -1;
00152     }
00153 
00154   // Now call the implementation for the rest of the header
00155   if (!this->write_reply_header (cdr,
00156                                  params))
00157     {
00158       if (TAO_debug_level > 4)
00159         ACE_ERROR ((LM_ERROR,
00160                     ACE_TEXT ("(%P|%t) Error in writing reply header \n")));
00161 
00162       return -1;
00163     }
00164 
00165   return 0;
00166 }

int TAO_GIOP_Message_Lite::generate_request_header TAO_Operation_Details op,
TAO_Target_Specification spec,
TAO_OutputCDR cdr
[virtual]
 

Write the RequestHeader in to the cdr stream. The underlying implementation of the mesaging should do the right thing.

Implements TAO_Pluggable_Messaging.

Definition at line 64 of file GIOP_Message_Lite.cpp.

References ACE_ERROR, ACE_TEXT, LM_ERROR, TAO_debug_level, TAO_GIOP_REQUEST, write_protocol_header(), and write_request_header().

00069 {
00070   // Write the GIOPLite header first
00071   if (!this->write_protocol_header (TAO_GIOP_REQUEST,
00072                                     cdr))
00073     {
00074       if (TAO_debug_level)
00075         ACE_ERROR ((LM_ERROR,
00076                     ACE_TEXT ("(%P|%t) Error in writing GIOP header \n")));
00077 
00078 
00079       return -1;
00080     }
00081 
00082   // Now call the implementation for the rest of the header
00083   if (!this->write_request_header (op,
00084                                    spec,
00085                                    cdr))
00086     {
00087       if (TAO_debug_level)
00088         ACE_ERROR ((LM_ERROR,
00089                     ACE_TEXT ("(%P|%t) Error in writing request header \n")));
00090 
00091       return -1;
00092     }
00093 
00094   return 0;
00095 
00096 }

size_t TAO_GIOP_Message_Lite::header_length void   )  const [private, virtual]
 

Header length.

Implements TAO_Pluggable_Messaging.

Definition at line 1738 of file GIOP_Message_Lite.cpp.

References TAO_GIOP_LITE_HEADER_LEN.

01739 {
01740   return TAO_GIOP_LITE_HEADER_LEN;
01741 }

void TAO_GIOP_Message_Lite::init CORBA::Octet  ,
CORBA::Octet 
[virtual]
 

Initialize the object -- this is a dummy for GIOPlite.

Implements TAO_Pluggable_Messaging.

Definition at line 43 of file GIOP_Message_Lite.cpp.

00045 {
00046   return;
00047 }

void TAO_GIOP_Message_Lite::init_queued_data TAO_Queued_Data qd  )  const [private]
 

Initialize the relevant portions of a TAO_Queued_Data.

Definition at line 1751 of file GIOP_Message_Lite.cpp.

References TAO_Queued_Data::byte_order_, TAO_Queued_Data::major_version_, message_type(), TAO_Queued_Data::minor_version_, TAO_Queued_Data::msg_type_, TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR, and TAO_ENCAP_BYTE_ORDER.

Referenced by consolidate_node(), extract_next_message(), and parse_next_message().

01752 {
01753   qd->byte_order_    = TAO_ENCAP_BYTE_ORDER;
01754   qd->major_version_ = TAO_DEF_GIOP_MAJOR;
01755   qd->minor_version_ = TAO_DEF_GIOP_MINOR;
01756   qd->msg_type_      = this->message_type ();
01757 }

int TAO_GIOP_Message_Lite::is_ready_for_bidirectional TAO_OutputCDR msg  )  [private, virtual]
 

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

Implements TAO_Pluggable_Messaging.

Definition at line 1731 of file GIOP_Message_Lite.cpp.

01732 {
01733   // No we dont support..
01734   return 0;
01735 }

TAO_Queued_Data * TAO_GIOP_Message_Lite::make_queued_data size_t  sz  )  [private]
 

Definition at line 1671 of file GIOP_Message_Lite.cpp.

References TAO_ORB_Core::create_input_cdr_data_block(), ACE_Message_Block::duplicate(), TAO_ORB_Core::input_cdr_msgblock_allocator(), TAO_Queued_Data::make_queued_data(), ACE_CDR::mb_align(), TAO_Queued_Data::msg_block_, ACE_Data_Block::release(), and TAO_Queued_Data::release().

Referenced by extract_next_message().

01672 {
01673   // Get a node for the queue..
01674   TAO_Queued_Data *qd =
01675     TAO_Queued_Data::make_queued_data ();
01676 
01677   if (qd == 0)
01678     {
01679       return 0;
01680     }
01681 
01682   // Make a datablock for the size requested + something. The
01683   // "something" is required because we are going to align the data
01684   // block in the message block. During alignment we could loose some
01685   // bytes. As we may not know how many bytes will be lost, we will
01686   // allocate ACE_CDR::MAX_ALIGNMENT extra.
01687   ACE_Data_Block *db =
01688     this->orb_core_->create_input_cdr_data_block (sz +
01689                                                   ACE_CDR::MAX_ALIGNMENT);
01690 
01691   if (db == 0)
01692     {
01693       TAO_Queued_Data::release (qd);
01694       return 0;
01695     }
01696 
01697   ACE_Allocator *alloc =
01698     this->orb_core_->input_cdr_msgblock_allocator ();
01699 
01700   ACE_Message_Block mb (db,
01701                         0,
01702                         alloc);
01703 
01704   ACE_Message_Block *new_mb = mb.duplicate ();
01705 
01706   if (new_mb == 0)
01707     {
01708       TAO_Queued_Data::release (qd);
01709       db->release();
01710 
01711       return 0;
01712     }
01713 
01714   ACE_CDR::mb_align (new_mb);
01715 
01716   qd->msg_block_ = new_mb;
01717 
01718   return qd;
01719 }

int TAO_GIOP_Message_Lite::make_send_locate_reply TAO_Transport transport,
TAO_OutputCDR output,
TAO_GIOP_Locate_Request_Header request,
TAO_GIOP_Locate_Status_Msg status
[private]
 

Make a GIOP_LOCATEREPLY and hand that over to the transport so that it can be sent over the connection.

Note:
As on date 1.1 & 1.2 seem to have similar headers. Till an unmanageable difference comes let them be implemented here.

Definition at line 1076 of file GIOP_Message_Lite.cpp.

References ACE_ERROR, ACE_TEXT, LM_ERROR, TAO_GIOP_Locate_Request_Header::request_id(), TAO_Transport::send_message(), TAO_debug_level, TAO_GIOP_LOCATEREPLY, write_locate_reply_mesg(), and write_protocol_header().

Referenced by process_locate_request().

01082 {
01083   // Note here we are making the Locate reply header which is *QUITE*
01084   // different from the reply header made by the make_reply () call..
01085   // Make the GIOP message header
01086   this->write_protocol_header (TAO_GIOP_LOCATEREPLY,
01087                                output);
01088 
01089   // This writes the header & body
01090   this->write_locate_reply_mesg (output,
01091                                  request.request_id (),
01092                                  status_info);
01093 
01094   // Send the message
01095   int result = transport->send_message (output);
01096 
01097   // Print out message if there is an error
01098   if (result == -1)
01099     {
01100       if (TAO_debug_level > 0)
01101         {
01102           ACE_ERROR ((LM_ERROR,
01103                       ACE_TEXT ("TAO: (%P|%t) %p: cannot send reply\n"),
01104                       ACE_TEXT ("TAO_GIOP_Message_Lite::make_send_locate_reply")));
01105         }
01106     }
01107 
01108   return result;
01109 }

TAO_Pluggable_Message_Type TAO_GIOP_Message_Lite::message_type void   )  const [private]
 

Get the message type. The return value would be one of the following: TAO_PLUGGABLE_MESSAGE_REQUEST, TAO_PLUGGABLE_MESSAGE_REPLY, TAO_PLUGGABLE_MESSAGE_CLOSECONNECTION, TAO_PLUGGABLE_MESSAGE_MESSAGE_ERROR. TAO_PLUGGABLE_MESSAGE_MESSAGE_CANCELREQUEST.

Definition at line 291 of file GIOP_Message_Lite.cpp.

References ACE_ERROR, ACE_TEXT, LM_ERROR, message_type_, TAO_GIOP_CANCELREQUEST, TAO_GIOP_CLOSECONNECTION, TAO_GIOP_FRAGMENT, TAO_GIOP_LOCATEREPLY, TAO_GIOP_LOCATEREQUEST, TAO_GIOP_MESSAGERROR, TAO_GIOP_REPLY, TAO_GIOP_REQUEST, TAO_PLUGGABLE_MESSAGE_CANCELREQUEST, TAO_PLUGGABLE_MESSAGE_CLOSECONNECTION, TAO_PLUGGABLE_MESSAGE_LOCATEREPLY, TAO_PLUGGABLE_MESSAGE_LOCATEREQUEST, TAO_PLUGGABLE_MESSAGE_MESSAGERROR, TAO_PLUGGABLE_MESSAGE_REPLY, and TAO_PLUGGABLE_MESSAGE_REQUEST.

Referenced by init_queued_data().

00292 {
00293   switch (this->message_type_)
00294     {
00295     case TAO_GIOP_REQUEST:
00296       return TAO_PLUGGABLE_MESSAGE_REQUEST;
00297     case TAO_GIOP_LOCATEREQUEST:
00298       return TAO_PLUGGABLE_MESSAGE_LOCATEREQUEST;
00299 
00300     case TAO_GIOP_LOCATEREPLY:
00301       return TAO_PLUGGABLE_MESSAGE_LOCATEREPLY;
00302     case TAO_GIOP_REPLY:
00303       return TAO_PLUGGABLE_MESSAGE_REPLY;
00304 
00305     case TAO_GIOP_CLOSECONNECTION:
00306       return TAO_PLUGGABLE_MESSAGE_CLOSECONNECTION;
00307 
00308     case TAO_GIOP_CANCELREQUEST:
00309       return TAO_PLUGGABLE_MESSAGE_CANCELREQUEST;
00310 
00311     case TAO_GIOP_MESSAGERROR:
00312     case TAO_GIOP_FRAGMENT:
00313       // Never happens: why??
00314     default:
00315         ACE_ERROR ((LM_ERROR,
00316                     ACE_TEXT ("TAO (%P|%t) %N:%l        message_type : ")
00317                     ACE_TEXT ("wrong message.\n")));
00318     }
00319 
00320   // In case of some errors
00321   return TAO_PLUGGABLE_MESSAGE_MESSAGERROR;
00322 }

TAO_OutputCDR & TAO_GIOP_Message_Lite::out_stream void   )  [private, virtual]
 

Accessor for the output CDR stream.

Implements TAO_Pluggable_Messaging.

Definition at line 50 of file GIOP_Message_Lite.cpp.

References cdr_.

00051 {
00052   return this->cdr_;
00053 }

int TAO_GIOP_Message_Lite::parse_incoming_messages ACE_Message_Block message_block  )  [private]
 

Parse the incoming messages..

Return values:
-1 There was some error parsing the GIOP header
0 The GIOP header was parsed correctly
1 There was not enough data in the message block to parse the header

Definition at line 244 of file GIOP_Message_Lite.cpp.

References byte_order_, ACE_Message_Block::length(), message_size_, message_type_, ACE_Message_Block::rd_ptr(), reset(), ACE_CDR::swap_4(), TAO_ENCAP_BYTE_ORDER, TAO_GIOP_LITE_HEADER_LEN, and TAO_GIOP_LITE_MESSAGE_TYPE_OFFSET.

Referenced by consolidate_node(), extract_next_message(), and parse_next_message().

00245 {
00246   this->reset ();
00247 
00248   // Make sure we have enough bytes in the header to read all
00249   // of the information.
00250   if (block.length () < TAO_GIOP_LITE_HEADER_LEN)
00251     {
00252       return 1;
00253     }
00254 
00255     // Get the read pointer
00256   char *rd_ptr = block.rd_ptr ();
00257 
00258   // We don't need to do this sort of copy. But some compilers (read it
00259   // as SunCC) have a problem in deferencing from the
00260   // reinterpret_cast pointer of the <rd_ptr>, as the <rd_ptr> can be
00261   // on stack. So let us go ahead with this copying...
00262   char buf [4];
00263   buf[0] = *rd_ptr;
00264   buf[1] = *(rd_ptr + 1);
00265   buf[2] = *(rd_ptr + 2);
00266   buf[3] = *(rd_ptr + 3);
00267 
00268   CORBA::ULong x = 0;
00269 #if !defined (ACE_DISABLE_SWAP_ON_READ)
00270   if (!(this->byte_order_ != TAO_ENCAP_BYTE_ORDER))
00271     {
00272       x = *(reinterpret_cast <ACE_CDR::ULong*> (buf));
00273     }
00274   else
00275     {
00276       ACE_CDR::swap_4 (buf, reinterpret_cast <char*> (&x));
00277     }
00278 #else
00279   x = *(reinterpret_cast <ACE_CDR::ULong*> (buf));
00280 #endif /* ACE_DISABLE_SWAP_ON_READ */
00281 
00282   this->message_size_ = x;
00283 
00284   // Get the message type.
00285   this->message_type_ = rd_ptr[TAO_GIOP_LITE_MESSAGE_TYPE_OFFSET];
00286 
00287   return 0;
00288 }

int TAO_GIOP_Message_Lite::parse_locate_header TAO_GIOP_Locate_Request_Header  )  [private]
 

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

Definition at line 1422 of file GIOP_Message_Lite.cpp.

References TAO_GIOP_Locate_Request_Header::incoming_stream(), TAO_GIOP_Locate_Request_Header::object_key(), ACE_InputCDR::read_ulong(), and TAO_GIOP_Locate_Request_Header::request_id().

Referenced by process_locate_request().

01425 {
01426   // Get the stream.
01427   TAO_InputCDR &msg = request.incoming_stream ();
01428 
01429   CORBA::Boolean hdr_status = 1;
01430 
01431   // Get the request id.
01432   CORBA::ULong req_id = 0;
01433   hdr_status = msg.read_ulong (req_id);
01434 
01435   // Store it in the Locate request classes.
01436   request.request_id (req_id);
01437 
01438   TAO::ObjectKey &object_key =
01439     request.object_key ();
01440 
01441   // Note that here there are no unions and so no problems.
01442   hdr_status = hdr_status && (msg >> object_key);
01443 
01444   return hdr_status ? 0 : -1;
01445 }

int TAO_GIOP_Message_Lite::parse_locate_reply TAO_InputCDR input,
TAO_Pluggable_Reply_Params params
[private]
 

Parse the locate reply message from the server.

int TAO_GIOP_Message_Lite::parse_next_message ACE_Message_Block incoming,
TAO_Queued_Data qd,
size_t &  mesg_length
[virtual]
 

Parse the details of the next message from the incoming and initializes attributes of qd. Returns 0 if the message header could not be parsed completely, returns a 1 if the message header could be parsed completely and returns -1 on error.

Implements TAO_Pluggable_Messaging.

Definition at line 325 of file GIOP_Message_Lite.cpp.

References init_queued_data(), ACE_Message_Block::length(), message_size_, TAO_Queued_Data::missing_data_, parse_incoming_messages(), TAO_GIOP_LITE_HEADER_LEN, and TAO_MISSING_DATA_UNDEFINED.

00328 {
00329   if (incoming.length () < TAO_GIOP_LITE_HEADER_LEN)
00330     {
00331       qd.missing_data_ = TAO_MISSING_DATA_UNDEFINED;
00332 
00333       return 0; /* incomplete header */
00334     }
00335   else
00336     {
00337       if (this->parse_incoming_messages (incoming) == -1)
00338     {
00339       return -1;
00340      }
00341 
00342       const size_t total_len =
00343         this->message_size_ + TAO_GIOP_LITE_HEADER_LEN;
00344 
00345       if (total_len > incoming.length ())
00346         {
00347           qd.missing_data_ = total_len - incoming.length ();
00348         }
00349       else
00350         {
00351           qd.missing_data_ = 0;
00352         }
00353 
00354       this->init_queued_data (&qd);
00355 
00356       mesg_length  = TAO_GIOP_LITE_HEADER_LEN + this->message_size_;
00357 
00358       return 1; /* parsed header successfully */
00359     }
00360 }

int TAO_GIOP_Message_Lite::parse_reply TAO_InputCDR input,
TAO_Pluggable_Reply_Params params
[private]
 

Parse the reply message.

Definition at line 1112 of file GIOP_Message_Lite.cpp.

References ACE_DEBUG, ACE_ERROR, ACE_TEXT, TAO_Transport_Mux_Strategy::dispatch_reply(), TAO_Transport::id(), TAO_Pluggable_Reply_Params::input_cdr_, LM_DEBUG, LM_ERROR, ACE_InputCDR::read_ulong(), TAO_Pluggable_Reply_Params_Base::reply_status_, TAO_Pluggable_Reply_Params_Base::request_id_, TAO_debug_level, TAO_GIOP_LOCATION_FORWARD, TAO_GIOP_NO_EXCEPTION, TAO_GIOP_SYSTEM_EXCEPTION, TAO_GIOP_USER_EXCEPTION, TAO_PLUGGABLE_MESSAGE_LOCATION_FORWARD, TAO_PLUGGABLE_MESSAGE_NO_EXCEPTION, TAO_PLUGGABLE_MESSAGE_SYSTEM_EXCEPTION, TAO_PLUGGABLE_MESSAGE_USER_EXCEPTION, TAO_Transport::tms(), and TAO_Pluggable_Reply_Params::transport_.

Referenced by process_reply_message().

01114 {
01115 
01116   // Read the request id
01117   if (!cdr.read_ulong (params.request_id_))
01118     {
01119       if (TAO_debug_level > 0)
01120         {
01121           ACE_DEBUG ((LM_DEBUG,
01122                       ACE_TEXT ("TAO (%P|%t|%N|%l) : ")
01123                       ACE_TEXT ("TAO_GIOP_Message_Lite::parse_reply, ")
01124                       ACE_TEXT ("extracting request id\n")));
01125         }
01126 
01127       return -1;
01128     }
01129 
01130   CORBA::ULong rep_stat = 0;
01131 
01132   // and the reply status type.  status can be NO_EXCEPTION,
01133   // SYSTEM_EXCEPTION, USER_EXCEPTION, LOCATION_FORWARD
01134   // CAnnot handle LOCATION_FORWARD_PERM here
01135   if (!cdr.read_ulong (rep_stat))
01136     {
01137       if (TAO_debug_level > 0)
01138         {
01139           ACE_DEBUG ((LM_DEBUG,
01140                       ACE_TEXT ("TAO (%P|%t|%N|%l) : ")
01141                       ACE_TEXT ("TAO_GIOP_Message_Lite::parse_reply, ")
01142                       ACE_TEXT ("extracting reply status\n")));
01143         }
01144 
01145       return -1;
01146     }
01147 
01148   // Pass the right Pluggable interface code to the transport layer
01149   switch (rep_stat)
01150     {
01151       // Request completed successfully
01152     case TAO_GIOP_NO_EXCEPTION:
01153       params.reply_status_ = TAO_PLUGGABLE_MESSAGE_NO_EXCEPTION;
01154       break;
01155 
01156       // Request terminated with user exception
01157     case TAO_GIOP_USER_EXCEPTION:
01158       params.reply_status_ = TAO_PLUGGABLE_MESSAGE_USER_EXCEPTION;
01159       break;
01160       // Request terminated with system exception
01161     case TAO_GIOP_SYSTEM_EXCEPTION:
01162       params.reply_status_ = TAO_PLUGGABLE_MESSAGE_SYSTEM_EXCEPTION;
01163       break;
01164       // Reply is a location forward type
01165     case TAO_GIOP_LOCATION_FORWARD:
01166       params.reply_status_ = TAO_PLUGGABLE_MESSAGE_LOCATION_FORWARD;
01167       break;
01168     default:
01169       if (TAO_debug_level > 0)
01170         {
01171           ACE_DEBUG ((LM_DEBUG,
01172                       ACE_TEXT ("(%N|%l) Unknown reply status \n")));
01173         }
01174     }
01175 
01176   params.input_cdr_= &cdr;
01177 
01178   if ( params.transport_->tms ()->dispatch_reply (params) == -1)
01179     {
01180       // Something really critical happened, we will forget about
01181       // every reply on this connection.
01182       if (TAO_debug_level > 0)
01183         ACE_ERROR ((LM_ERROR,
01184                     "TAO (%P|%t) - GIOP_Message_Lite[%d]::process_parsed_messages, "
01185                     "dispatch reply failed\n",
01186                     params.transport_->id ()));
01187 
01188       return -1;
01189     }
01190 
01191   return 0;
01192 }

int TAO_GIOP_Message_Lite::parse_request_header TAO_ServerRequest  )  [private]
 

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

Definition at line 1344 of file GIOP_Message_Lite.cpp.

References TAO::String_var< charT >::_retn(), ACE_InputCDR::char_translator(), ACE_InputCDR::good_bit(), TAO_ServerRequest::incoming(), TAO::String_var< charT >::inout(), TAO_ServerRequest::object_key(), CORBA::Octet, TAO_ServerRequest::operation(), ACE_InputCDR::rd_ptr(), ACE_InputCDR::read_long(), ACE_InputCDR::read_octet(), ACE_InputCDR::read_string(), ACE_InputCDR::read_ulong(), TAO::unbounded_value_sequence< T >::replace(), TAO_ServerRequest::request_id(), TAO_ServerRequest::response_expected(), ACE_InputCDR::skip_bytes(), CORBA::String_var, and TAO_ServerRequest::sync_with_server().

Referenced by process_request().

01345 {
01346   // Get the input CDR in the request class
01347   TAO_InputCDR & input = *request.incoming ();
01348 
01349   CORBA::Boolean hdr_status = (CORBA::Boolean) input.good_bit ();
01350 
01351   CORBA::ULong req_id = 0;
01352 
01353   // Get the rest of the request header ...
01354   hdr_status = hdr_status && input.read_ulong (req_id);
01355 
01356   request.request_id (req_id);
01357 
01358   CORBA::Octet response_flags = CORBA::Octet();
01359   hdr_status = hdr_status && input.read_octet (response_flags);
01360   request.response_expected ((response_flags != 0));
01361 
01362    // The high bit of the octet has been set if the SyncScope policy
01363   // value is SYNC_WITH_SERVER. This is a temporary hack until all
01364   // of GIOP 1.2 is in place. Then we can check the version in the
01365   // message header instead.
01366   request.sync_with_server ((response_flags == 129));
01367 
01368     // We use ad-hoc demarshalling here: there is no need to increase
01369   // the reference count on the CDR message block, because this key
01370   // will not outlive the request (or the message block).
01371   CORBA::Long key_length = 0;
01372   hdr_status = hdr_status && input.read_long (key_length);
01373 
01374   if (hdr_status)
01375     {
01376       request.object_key ().replace (key_length, key_length,
01377                                      (CORBA::Octet*)input.rd_ptr (),
01378                                      0);
01379       input.skip_bytes (key_length);
01380     }
01381 
01382   if (input.char_translator () == 0)
01383     {
01384       CORBA::ULong length = 0;
01385       hdr_status = hdr_status && input.read_ulong (length);
01386 
01387       if (hdr_status)
01388         {
01389           // Do not include NULL character at the end.
01390           // @@ This is not getting demarshaled using the codeset
01391           //    translators!
01392 
01393           // Notice that there are no memory allocations involved
01394           // here!
01395 
01396           request.operation (input.rd_ptr (),
01397                              length - 1,
01398                              0 /* TAO_ServerRequest does NOT own string */);
01399 
01400           hdr_status = input.skip_bytes (length);
01401         }
01402     }
01403   else
01404     {
01405       // @@ We could optimize for this case too, i.e. do in-place
01406       //    demarshaling of the string... But there is an issue
01407       //    pending on the OMG as to whether the operation should be
01408       //    sent in the connection negotiated codeset or always in
01409       //    ISO8859-1.
01410       CORBA::String_var tmp;
01411       hdr_status = hdr_status && input.read_string (tmp.inout ());
01412 
01413       request.operation (tmp._retn (),
01414                          0,
01415                          1 /* TAO_ServerRequest owns string */);
01416     }
01417 
01418   return hdr_status ? 0 : -1;
01419 }

int TAO_GIOP_Message_Lite::process_locate_request TAO_Transport transport,
TAO_InputCDR input,
TAO_OutputCDR output
[private]
 

Processes the GIOP_LOCATE_REQUEST messages.

Definition at line 935 of file GIOP_Message_Lite.cpp.

References ACE_CATCHALL, ACE_CATCHANY, ACE_DEBUG, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_TEXT, ACE_TRY, ACE_TRY_CHECK, ACE_TRY_THROW, TAO_ORB_Core::adapter_registry(), TAO_Adapter_Registry::dispatch(), TAO_ServerRequest::exception_type(), TAO_ServerRequest::forward_location(), TAO_GIOP_Locate_Status_Msg::forward_location_var, TAO::unbounded_value_sequence< T >::get_buffer(), TAO_Pseudo_Var_T< T >::in(), CORBA::is_nil(), TAO::unbounded_value_sequence< T >::length(), LM_DEBUG, make_send_locate_reply(), TAO_ServerRequest::object_key(), TAO_GIOP_Locate_Request_Header::object_key(), CORBA::Object_var, TAO_Transport::orb_core_, TAO_InputCDR::orb_core_, parse_locate_header(), TAO_GIOP_Locate_Request_Header::request_id(), TAO_GIOP_Locate_Status_Msg::status, TAO_debug_level, TAO_GIOP_NO_EXCEPTION, TAO_GIOP_OBJECT_FORWARD, TAO_GIOP_OBJECT_HERE, and TAO_GIOP_UNKNOWN_OBJECT.

Referenced by process_request_message().

00938 {
00939   // This will extract the request header, set <response_required> as
00940   // appropriate.
00941   TAO_GIOP_Locate_Request_Header locate_request (input,
00942                                                  this->orb_core_);
00943 
00944   TAO_GIOP_Locate_Status_Msg status_info;
00945 
00946   // Defaulting.
00947   status_info.status = TAO_GIOP_UNKNOWN_OBJECT;
00948 
00949   CORBA::Boolean response_required = 1;
00950 
00951   ACE_DECLARE_NEW_CORBA_ENV;
00952   ACE_TRY
00953     {
00954       int parse_error =
00955         this->parse_locate_header (locate_request);
00956 
00957       if (parse_error != 0)
00958         {
00959           ACE_TRY_THROW (CORBA::MARSHAL (0,
00960                                          CORBA::COMPLETED_NO));
00961         }
00962 
00963       // Execute a fake request to find out if the object is there or
00964       // if the POA can activate it on demand...
00965       char repbuf[ACE_CDR::DEFAULT_BUFSIZE];
00966       TAO_OutputCDR dummy_output (repbuf,
00967                                   sizeof repbuf);
00968       // This output CDR is not used!
00969 
00970       TAO::ObjectKey tmp_key (locate_request.object_key ().length (),
00971                               locate_request.object_key ().length (),
00972                               locate_request.object_key ().get_buffer (),
00973                               0);
00974 
00975       // Set it to an error state
00976       parse_error = 1;
00977       CORBA::ULong req_id = locate_request.request_id ();
00978 
00979       // We will send the reply. The ServerRequest class need not send
00980       // the reply
00981       CORBA::Boolean deferred_reply = 1;
00982       TAO_ServerRequest server_request (this,
00983                                         req_id,
00984                                         response_required,
00985                                         deferred_reply,
00986                                         tmp_key,
00987                                         "_non_existent",
00988                                         dummy_output,
00989                                         transport,
00990                                         this->orb_core_,
00991                                         parse_error);
00992 
00993       if (parse_error != 0)
00994         {
00995           ACE_TRY_THROW (CORBA::MARSHAL (0,
00996                                          CORBA::COMPLETED_NO));
00997         }
00998 
00999       CORBA::Object_var forward_to;
01000 
01001       this->orb_core_->adapter_registry ()->dispatch (server_request.object_key (),
01002                                                       server_request,
01003                                                       forward_to
01004                                                        ACE_ENV_ARG_PARAMETER);
01005       ACE_TRY_CHECK;
01006 
01007       if (!CORBA::is_nil (forward_to.in ()))
01008         {
01009           status_info.status = TAO_GIOP_OBJECT_FORWARD;
01010           status_info.forward_location_var = forward_to;
01011           ACE_DEBUG ((LM_DEBUG,
01012                       ACE_TEXT ("TAO (%P|%t) - TAO_GIOP_Message_Lite::process_locate_request, ")
01013                       ACE_TEXT ("called: forwarding\n")));
01014         }
01015       else if (server_request.exception_type () == TAO_GIOP_NO_EXCEPTION)
01016         {
01017           // We got no exception, so the object is here.
01018           status_info.status = TAO_GIOP_OBJECT_HERE;
01019           if (TAO_debug_level > 0)
01020             ACE_DEBUG ((LM_DEBUG,
01021                         ACE_TEXT ("TAO (%P|%t) - TAO_GIOP_Message_Lite::process_locate_request, ")
01022                         ACE_TEXT ("found\n")));
01023         }
01024       else
01025         {
01026           status_info.forward_location_var = server_request.forward_location ();
01027 
01028           if (!CORBA::is_nil (status_info.forward_location_var.in ()))
01029             {
01030               status_info.status = TAO_GIOP_OBJECT_FORWARD;
01031               ACE_DEBUG ((LM_DEBUG,
01032                           ACE_TEXT ("TAO (%P|%t) - TAO_GIOP_Message_Lite::process_locate_request, ")
01033                           ACE_TEXT ("forwarding\n")));
01034             }
01035           else
01036             {
01037               // Normal exception, so the object is not here
01038               status_info.status = TAO_GIOP_UNKNOWN_OBJECT;
01039               ACE_DEBUG ((LM_DEBUG,
01040                           ACE_TEXT ("TAO (%P|%t) - TAO_GIOP_Message_Lite::process_locate_request, ")
01041                           ACE_TEXT ("not here\n")));
01042             }
01043         }
01044     }
01045 
01046   ACE_CATCHANY
01047     {
01048       // Normal exception, so the object is not here
01049       status_info.status = TAO_GIOP_UNKNOWN_OBJECT;
01050       if (TAO_debug_level > 0)
01051         ACE_DEBUG ((LM_DEBUG,
01052                     ACE_TEXT ("TAO (%P|%t) TAO_GIOP_Message_Lite::process_locate_request - ")
01053                     ACE_TEXT ("CORBA exception raised\n")));
01054     }
01055 #if defined (TAO_HAS_EXCEPTIONS)
01056   ACE_CATCHALL
01057     {
01058       // Normal exception, so the object is not here
01059       status_info.status = TAO_GIOP_UNKNOWN_OBJECT;
01060       if (TAO_debug_level > 0)
01061         ACE_DEBUG ((LM_DEBUG,
01062                     ACE_TEXT ("TAO (%P|%t) TAO_GIOP_Message_Lite::process_locate_request - ")
01063                     ACE_TEXT ("C++ exception raised\n")));
01064     }
01065 #endif /* TAO_HAS_EXCEPTIONS */
01066   ACE_ENDTRY;
01067 
01068   return this->make_send_locate_reply (transport,
01069                                        output,
01070                                        locate_request,
01071                                        status_info);
01072 }

int TAO_GIOP_Message_Lite::process_reply_message TAO_Pluggable_Reply_Params reply_info,
TAO_Queued_Data qd
[virtual]
 

Parse the reply message that we received and return the reply information through reply_info

Implements TAO_Pluggable_Messaging.

Definition at line 612 of file GIOP_Message_Lite.cpp.

References ACE_Message_Block::base(), TAO_Queued_Data::byte_order_, ACE_Message_Block::data_block(), dump_msg(), ACE_Message_Block::length(), TAO_Queued_Data::major_version_, TAO_Queued_Data::minor_version_, TAO_Queued_Data::msg_block_, TAO_Queued_Data::msg_type_, parse_reply(), ACE_Message_Block::rd_ptr(), TAO_debug_level, TAO_GIOP_LITE_HEADER_LEN, TAO_PLUGGABLE_MESSAGE_LOCATEREPLY, TAO_PLUGGABLE_MESSAGE_REPLY, and ACE_Message_Block::wr_ptr().

00616 {
00617 
00618 
00619   // Get the read and write positions before we steal data.
00620   size_t rd_pos = qd->msg_block_->rd_ptr () - qd->msg_block_->base ();
00621   size_t wr_pos = qd->msg_block_->wr_ptr () - qd->msg_block_->base ();
00622   rd_pos += TAO_GIOP_LITE_HEADER_LEN;
00623 
00624   if (TAO_debug_level > 0)
00625     this->dump_msg ("recv",
00626                     reinterpret_cast <u_char *> (qd->msg_block_->rd_ptr ()),
00627                     qd->msg_block_->length ());
00628 
00629 
00630   // Create a empty buffer on stack
00631   // NOTE: We use the same data block in which we read the message and
00632   // we pass it on to the higher layers of the ORB. So we dont to any
00633   // copies at all here. The same is also done in the higher layers.
00634   TAO_InputCDR input_cdr (qd->msg_block_->data_block (),
00635                           ACE_Message_Block::DONT_DELETE,
00636                           rd_pos,
00637                           wr_pos,
00638                           qd->byte_order_,
00639                           qd->major_version_,
00640                           qd->minor_version_,
00641                           this->orb_core_);
00642 
00643   // Reset the message state. Now, we are ready for the next nested
00644   // upcall if any.
00645   // this->message_handler_.reset (0);
00646 
00647   // We know we have some reply message. Check whether it is a
00648   // GIOP_REPLY or GIOP_LOCATE_REPLY to take action.
00649 
00650   // Once we send the InputCDR stream we need to just forget about
00651   // the stream and never touch that again for anything. We basically
00652   // loose ownership of the data_block.
00653 
00654   // We know we have some reply message. Check whether it is a
00655   // GIOP_REPLY or GIOP_LOCATE_REPLY to take action.
00656   switch (qd->msg_type_)
00657     {
00658     case TAO_PLUGGABLE_MESSAGE_REPLY:
00659       // Should be taken care by the state specific parsing
00660       return this->parse_reply (input_cdr,
00661                                 params);
00662     case TAO_PLUGGABLE_MESSAGE_LOCATEREPLY:
00663       // We call parse_reply () here because, the message format for
00664       // the LOCATEREPLY & REPLY are same.
00665       return this->parse_reply (input_cdr,
00666                                 params);
00667     default:
00668       return -1;
00669     }
00670 }

int TAO_GIOP_Message_Lite::process_request TAO_Transport transport,
TAO_InputCDR input,
TAO_OutputCDR output
[private]
 

Processes the GIOP_REQUEST messages.

Definition at line 738 of file GIOP_Message_Lite.cpp.

References ACE_ANY_EXCEPTION, ACE_CATCHALL, ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ERROR, ACE_PRINT_EXCEPTION, ACE_TEXT, ACE_TRY, ACE_TRY_CHECK, ACE_TRY_THROW, TAO_ORB_Core::adapter_registry(), TAO_Transport::assign_translators(), TAO_ORB_Core::codeset_manager(), TAO_Adapter_Registry::dispatch(), generate_reply_header(), TAO_Pseudo_Var_T< T >::in(), CORBA::is_nil(), TAO::unbounded_value_sequence< ServiceContext >::length(), LM_ERROR, TAO_ServerRequest::object_key(), CORBA::Object_var, TAO_ServerRequest::orb_core(), TAO_Transport::orb_core_, parse_request_header(), TAO_Codeset_Manager::process_service_context(), TAO_ServerRequest::reply_service_info(), TAO_Pluggable_Reply_Params_Base::reply_status_, TAO_ServerRequest::request_id(), TAO_Pluggable_Reply_Params_Base::request_id_, TAO_ServerRequest::response_expected(), TAO_Transport::send_message(), send_reply_exception(), TAO_Pluggable_Reply_Params_Base::service_context_notowned(), TAO_Pluggable_Reply_Params_Base::svc_ctx_, TAO_debug_level, TAO_GIOP_LOCATION_FORWARD, and TAO_UNHANDLED_SERVER_CXX_EXCEPTION.

Referenced by process_request_message().

00741 {
00742   // This will extract the request header, set <response_required>
00743   // and <sync_with_server> as appropriate.
00744   TAO_ServerRequest request (this,
00745                              cdr,
00746                              output,
00747                              transport,
00748                              this->orb_core_);
00749 
00750   CORBA::ULong request_id = 0;
00751   CORBA::Boolean response_required = 0;
00752 
00753   int parse_error = 0;
00754 
00755   ACE_DECLARE_NEW_CORBA_ENV;
00756   ACE_TRY
00757     {
00758       parse_error =
00759         this->parse_request_header (request);
00760 
00761       TAO_Codeset_Manager *csm = request.orb_core()->codeset_manager();
00762       if (csm)
00763         {
00764           csm->process_service_context(request);
00765           transport->assign_translators(&cdr,&output);
00766         }
00767 
00768       // Throw an exception if the
00769       if (parse_error != 0)
00770         ACE_TRY_THROW (CORBA::MARSHAL (0,
00771                                        CORBA::COMPLETED_NO));
00772       request_id = request.request_id ();
00773 
00774       response_required = request.response_expected ();
00775 
00776       CORBA::Object_var forward_to;
00777 
00778       // Do this before the reply is sent.
00779       this->orb_core_->adapter_registry ()->dispatch (request.object_key (),
00780                                                       request,
00781                                                       forward_to
00782                                                        ACE_ENV_ARG_PARAMETER);
00783       ACE_TRY_CHECK;
00784 
00785       if (!CORBA::is_nil (forward_to.in ()))
00786         {
00787           // We should forward to another object...
00788           TAO_Pluggable_Reply_Params reply_params (transport);
00789           reply_params.request_id_ = request_id;
00790           reply_params.reply_status_ = TAO_GIOP_LOCATION_FORWARD;
00791           reply_params.svc_ctx_.length (0);
00792 
00793           // Send back the reply service context list.
00794           reply_params.service_context_notowned (&request.reply_service_info ());
00795 
00796           // Make the GIOP header and Reply header
00797           this->generate_reply_header (output,
00798                                        reply_params);
00799 
00800           if (!(output << forward_to.in ()))
00801             {
00802               if (TAO_debug_level > 0)
00803                 ACE_ERROR ((LM_ERROR,
00804                             ACE_TEXT ("TAO (%P|%t) ERROR: Unable to marshal ")
00805                             ACE_TEXT ("forward reference.\n")));
00806 
00807               return -1;
00808             }
00809 
00810           int result = transport->send_message (output);
00811           if (result == -1)
00812             {
00813               if (TAO_debug_level > 0)
00814                 {
00815                   // No exception but some kind of error, yet a
00816                   // response is required.
00817                   ACE_ERROR ((LM_ERROR,
00818                               ACE_TEXT ("TAO: (%P|%t|%N|%l) %p: ")
00819                               ACE_TEXT ("cannot send reply\n"),
00820                               ACE_TEXT ("TAO_GIOP_Message_Lite::process_request")));
00821                 }
00822             }
00823           return result;
00824         }
00825     }
00826   // Only CORBA exceptions are caught here.
00827   ACE_CATCHANY
00828     {
00829       int result = 0;
00830 
00831       if (response_required)
00832         {
00833           result = this->send_reply_exception (transport,
00834                                                this->orb_core_,
00835                                                request_id,
00836                                                &request.reply_service_info (),
00837                                                &ACE_ANY_EXCEPTION);
00838           if (result == -1)
00839             {
00840               if (TAO_debug_level > 0)
00841                 {
00842                   ACE_ERROR ((LM_ERROR,
00843                               ACE_TEXT ("TAO: (%P|%t|%N|%l) %p: ")
00844                               ACE_TEXT ("cannot send exception\n"),
00845                               ACE_TEXT ("process_request ()")));
00846                   ACE_PRINT_EXCEPTION (
00847                       ACE_ANY_EXCEPTION,
00848                       "TAO_GIOP_Message_Lite::process_request[2]");
00849                 }
00850             }
00851 
00852         }
00853       else if (TAO_debug_level > 0)
00854         {
00855           // It is unfortunate that an exception (probably a system
00856           // exception) was thrown by the upcall code (even by the
00857           // user) when the client was not expecting a response.
00858           // However, in this case, we cannot close the connection
00859           // down, since it really isn't the client's fault.
00860 
00861           ACE_ERROR ((LM_ERROR,
00862                       ACE_TEXT ("(%P|%t) exception thrown ")
00863                       ACE_TEXT ("but client is not waiting a response\n")));
00864 
00865           ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
00866                                "TAO: ");
00867         }
00868 
00869       return result;
00870     }
00871 #if defined (TAO_HAS_EXCEPTIONS)
00872   ACE_CATCHALL
00873     {
00874       // @@ TODO some c++ exception or another, but what do we do with
00875       //    it?
00876       // We are supposed to map it into a CORBA::UNKNOWN exception.
00877       // BTW, this cannot be detected if using the <env> mapping.  If
00878       // we have native exceptions but no support for them in the ORB
00879       // we should still be able to catch it.  If we don't have native
00880       // exceptions it couldn't have been raised in the first place!
00881       int result = 0;
00882 
00883       if (response_required)
00884         {
00885           CORBA::UNKNOWN exception (
00886               CORBA::SystemException::_tao_minor_code (
00887                   TAO_UNHANDLED_SERVER_CXX_EXCEPTION,
00888                   0
00889                 ),
00890               CORBA::COMPLETED_MAYBE
00891             );
00892 
00893           result = this->send_reply_exception (transport,
00894                                                this->orb_core_,
00895                                                request_id,
00896                                                &request.reply_service_info (),
00897                                                &exception);
00898           if (result == -1)
00899             {
00900               if (TAO_debug_level > 0)
00901                 {
00902                   ACE_ERROR ((LM_ERROR,
00903                               ACE_TEXT ("TAO (%P|%t) - TAO_GIOP_Message_Lite::process_request[3], ")
00904                               ACE_TEXT ("%p: ")
00905                               ACE_TEXT ("cannot send exception\n"),
00906                               ACE_TEXT ("process_request ()")));
00907                   ACE_PRINT_EXCEPTION (
00908                       exception,
00909                       "TAO_GIOP_Message_Lite::process_request[3]");
00910                 }
00911             }
00912         }
00913       else if (TAO_debug_level > 0)
00914         {
00915           // It is unfotunate that an exception (probably a system
00916           // exception) was thrown by the upcall code (even by the
00917           // user) when the client was not expecting a response.
00918           // However, in this case, we cannot close the connection
00919           // down, since it really isn't the client's fault.
00920           ACE_ERROR ((LM_ERROR,
00921                       ACE_TEXT ("(%P|%t|%N|%l) exception thrown ")
00922                       ACE_TEXT ("but client is not waiting a response\n")));
00923         }
00924 
00925       return result;
00926     }
00927 #endif /* TAO_HAS_EXCEPTIONS */
00928   ACE_ENDTRY;
00929 
00930   return 0;
00931 }

int TAO_GIOP_Message_Lite::process_request_message TAO_Transport transport,
TAO_Queued_Data qd
[virtual]
 

Process the request message that we have received on the connection

Implements TAO_Pluggable_Messaging.

Definition at line 536 of file GIOP_Message_Lite.cpp.

References TAO_Transport::assign_translators(), ACE_Message_Block::base(), TAO_Queued_Data::byte_order_, TAO_ORB_Parameters::cdr_memcpy_tradeoff(), ACE_Message_Block::data_block(), dump_msg(), ACE_Message_Block::length(), TAO_ORB_Core::lf_strategy(), TAO_Queued_Data::major_version_, ACE_OS::memset(), TAO_Queued_Data::minor_version_, TAO_Queued_Data::msg_block_, TAO_Queued_Data::msg_type_, TAO_ORB_Core::orb_params(), TAO_ORB_Core::output_cdr_dblock_allocator(), TAO_ORB_Core::output_cdr_msgblock_allocator(), process_locate_request(), process_request(), ACE_Message_Block::rd_ptr(), TAO_LF_Strategy::set_upcall_thread(), TAO_debug_level, TAO_ENCAP_BYTE_ORDER, TAO_GIOP_LITE_HEADER_LEN, TAO_PLUGGABLE_MESSAGE_LOCATEREQUEST, TAO_PLUGGABLE_MESSAGE_REQUEST, and ACE_Message_Block::wr_ptr().

00538 {
00539   // Set the upcall thread
00540   this->orb_core_->lf_strategy ().set_upcall_thread (
00541       this->orb_core_->leader_follower ());
00542 
00543   // A buffer that we will use to initialise the CDR stream
00544   char repbuf[ACE_CDR::DEFAULT_BUFSIZE];
00545 
00546 #if defined(ACE_INITIALIZE_MEMORY_BEFORE_USE)
00547   (void) ACE_OS::memset (repbuf,
00548                          '\0',
00549                          sizeof repbuf);
00550 #endif /* ACE_INITIALIZE_MEMORY_BEFORE_USE */
00551 
00552   // Initialze an output CDR on the stack
00553   TAO_OutputCDR output (repbuf,
00554                         sizeof repbuf,
00555                         TAO_ENCAP_BYTE_ORDER,
00556                         this->orb_core_->output_cdr_buffer_allocator (),
00557                         this->orb_core_->output_cdr_dblock_allocator (),
00558                         this->orb_core_->output_cdr_msgblock_allocator (),
00559                         this->orb_core_->orb_params ()->cdr_memcpy_tradeoff (),
00560                         qd->major_version_,
00561                         qd->minor_version_);
00562 
00563   transport->assign_translators(0,&output);
00564 
00565   // Get the read and write positions before we steal data.
00566   size_t rd_pos = qd->msg_block_->rd_ptr () - qd->msg_block_->base ();
00567   size_t wr_pos = qd->msg_block_->wr_ptr () - qd->msg_block_->base ();
00568   rd_pos += TAO_GIOP_LITE_HEADER_LEN;
00569 
00570   if (TAO_debug_level > 0)
00571     this->dump_msg ("recv",
00572                     reinterpret_cast <u_char *> (qd->msg_block_->rd_ptr ()),
00573                     qd->msg_block_->length ());
00574 
00575 
00576   // Create a input CDR stream.
00577   // NOTE: We use the same data block in which we read the message and
00578   // we pass it on to the higher layers of the ORB. So we dont to any
00579   // copies at all here. The same is also done in the higher layers.
00580 
00581   TAO_InputCDR input_cdr (qd->msg_block_->data_block (),
00582                           ACE_Message_Block::DONT_DELETE,
00583                           rd_pos,
00584                           wr_pos,
00585                           qd->byte_order_,
00586                           qd->major_version_,
00587                           qd->minor_version_,
00588                           this->orb_core_);
00589 
00590 
00591   // We know we have some request message. Check whether it is a
00592   // GIOP_REQUEST or GIOP_LOCATE_REQUEST to take action.
00593   switch (qd->msg_type_)
00594     {
00595     case TAO_PLUGGABLE_MESSAGE_REQUEST:
00596       // Should be taken care by the state specific invocations. They
00597       // could raise an exception or write things in the output CDR
00598       // stream
00599       return this->process_request (transport,
00600                                     input_cdr,
00601                                     output);
00602     case TAO_PLUGGABLE_MESSAGE_LOCATEREQUEST:
00603       return this->process_locate_request (transport,
00604                                            input_cdr,
00605                                            output);
00606     default:
00607       return -1;
00608     }
00609 }

void TAO_GIOP_Message_Lite::reset void   )  [virtual]
 

Reset the messaging the object.

Implements TAO_Pluggable_Messaging.

Definition at line 56 of file GIOP_Message_Lite.cpp.

References message_size_, and message_type_.

Referenced by parse_incoming_messages().

00057 {
00058   this->message_type_ = 0;
00059   this->message_size_ = 0;
00060 }

void TAO_GIOP_Message_Lite::send_close_connection const TAO_GIOP_Message_Version version,
TAO_Transport transport,
void *  ctx
[private]
 

Close a connection, first sending GIOP::CloseConnection.

int TAO_GIOP_Message_Lite::send_error TAO_Transport transport  )  [private]
 

Send error messages.

Definition at line 1565 of file GIOP_Message_Lite.cpp.

References ACE_DEBUG, ACE_TEXT, dump_msg(), TAO_Transport::id(), LM_DEBUG, TAO_Transport::send_message_block_chain(), TAO_debug_level, TAO_GIOP_LITE_HEADER_LEN, TAO_GIOP_MESSAGERROR, and ACE_Message_Block::wr_ptr().

01566 {
01567   const char error_message [TAO_GIOP_LITE_HEADER_LEN] =
01568   {
01569     // The following works on non-ASCII platforms, such as MVS (which
01570     // uses EBCDIC).
01571     TAO_GIOP_MESSAGERROR,
01572     0, 0, 0, 0
01573   };
01574 
01575   this->dump_msg ("send_error",
01576                   (const u_char *) error_message,
01577                   TAO_GIOP_LITE_HEADER_LEN);
01578 
01579   ACE_Data_Block data_block (TAO_GIOP_LITE_HEADER_LEN,
01580                              ACE_Message_Block::MB_DATA,
01581                              error_message,
01582                              0,
01583                              0,
01584                              ACE_Message_Block::DONT_DELETE,
01585                              0);
01586   ACE_Message_Block message_block(&data_block);
01587   message_block.wr_ptr (TAO_GIOP_LITE_HEADER_LEN);
01588 
01589   size_t bt;
01590   int result = transport->send_message_block_chain (&message_block,
01591                                                     bt);
01592   if (result == -1)
01593     {
01594       if (TAO_debug_level > 0)
01595         {
01596           ACE_DEBUG ((
01597               LM_DEBUG,
01598               ACE_TEXT ("TAO (%N|%l|%P|%t) error sending error to transport %u, errno = %d\n"),
01599               transport->id (), errno
01600             ));
01601         }
01602     }
01603 
01604   return result;
01605 }

int TAO_GIOP_Message_Lite::send_reply_exception TAO_Transport transport,
TAO_ORB_Core orb_core,
CORBA::ULong  request_id,
IOP::ServiceContextList svc_info,
CORBA::Exception x
[private]
 

We must send a LocateReply through transport, this request resulted in some kind of exception.

Definition at line 1448 of file GIOP_Message_Lite.cpp.

References CORBA::SystemException::_downcast(), CORBA::Exception::_tao_encode(), ACE_CATCH, ACE_DEBUG, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_TEXT, ACE_TRY, ACE_TRY_CHECK, TAO_Transport::assign_translators(), TAO_ORB_Parameters::cdr_memcpy_tradeoff(), TAO_Transport::id(), TAO::unbounded_value_sequence< ServiceContext >::length(), LM_DEBUG, ACE_OS::memset(), TAO_ORB_Core::orb_params(), TAO_ORB_Core::output_cdr_buffer_allocator(), TAO_ORB_Core::output_cdr_dblock_allocator(), TAO_ORB_Core::output_cdr_msgblock_allocator(), TAO_Pluggable_Reply_Params_Base::reply_status_, TAO_Pluggable_Reply_Params_Base::request_id_, TAO_Transport::send_message(), TAO_Pluggable_Reply_Params_Base::service_context_notowned(), TAO_Pluggable_Reply_Params_Base::svc_ctx_, TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR, TAO_ENCAP_BYTE_ORDER, TAO_GIOP_SYSTEM_EXCEPTION, TAO_GIOP_USER_EXCEPTION, and write_reply_header().

Referenced by process_request().

01455 {
01456   // Create a new output CDR stream
01457   char repbuf[ACE_CDR::DEFAULT_BUFSIZE];
01458 
01459 #if defined(ACE_INITIALIZE_MEMORY_BEFORE_USE)
01460   (void) ACE_OS::memset (repbuf,
01461                          '\0',
01462                          sizeof repbuf);
01463 #endif /* ACE_INITIALIZE_MEMORY_BEFORE_USE */
01464   TAO_OutputCDR output (repbuf,
01465                         sizeof repbuf,
01466                         TAO_ENCAP_BYTE_ORDER,
01467                         orb_core->output_cdr_buffer_allocator (),
01468                         orb_core->output_cdr_dblock_allocator (),
01469                         orb_core->output_cdr_msgblock_allocator (),
01470                         orb_core->orb_params ()->cdr_memcpy_tradeoff (),
01471                         TAO_DEF_GIOP_MAJOR,
01472                         TAO_DEF_GIOP_MINOR);
01473 
01474   transport->assign_translators(0,&output);
01475 
01476   // Make the GIOP & reply header. They are version specific.
01477   TAO_Pluggable_Reply_Params reply_params (transport);
01478   reply_params.request_id_ = request_id;
01479   reply_params.svc_ctx_.length (0);
01480 
01481   // Send back the service context we received.  (RTCORBA relies on
01482   // this).
01483   reply_params.service_context_notowned (svc_info);
01484 
01485   // A new try/catch block, but if something goes wrong now we have no
01486   // hope, just abort.
01487   ACE_DECLARE_NEW_CORBA_ENV;
01488 
01489   ACE_TRY
01490     {
01491       // Write the exception.
01492       reply_params.reply_status_ = TAO_GIOP_USER_EXCEPTION;
01493 
01494       if (CORBA::SystemException::_downcast (x) != 0)
01495         {
01496           reply_params.reply_status_ = TAO_GIOP_SYSTEM_EXCEPTION;
01497         }
01498 
01499       // Make the GIOP & reply header. They are version specific.
01500       this->write_reply_header (output,
01501                                 reply_params);
01502 
01503 
01504       x->_tao_encode (output ACE_ENV_ARG_PARAMETER);
01505       ACE_TRY_CHECK;
01506     }
01507   ACE_CATCH (CORBA::Exception, ex)
01508     {
01509       // Now we know that while handling the error an other error
01510       // happened -> no hope, close connection.
01511 
01512       // Close the handle.
01513       ACE_DEBUG ((LM_DEBUG,
01514                   ACE_TEXT ("(%P|%t|%N|%l) cannot marshal exception on transport %u: %p\n"),
01515                   transport->id (),
01516                   ACE_TEXT ("send_reply_exception ()")));
01517       return -1;
01518     }
01519   ACE_ENDTRY;
01520 
01521   return transport->send_message (output);
01522 }

int TAO_GIOP_Message_Lite::write_locate_reply_mesg TAO_OutputCDR output,
CORBA::ULong  request_id,
TAO_GIOP_Locate_Status_Msg status
[private]
 

Writes the locate _reply message in to the .

Definition at line 1526 of file GIOP_Message_Lite.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_LOCATEREPLY, TAO_GIOP_OBJECT_FORWARD, write_protocol_header(), and ACE_OutputCDR::write_ulong().

Referenced by make_send_locate_reply().

01531 {
01532   // Note here we are making the Locate reply header which is *QUITE*
01533   // different from the reply header made by the make_reply () call..
01534 
01535   // Make the GIOP message header
01536   this->write_protocol_header (TAO_GIOP_LOCATEREPLY,
01537                                output);
01538 
01539   // Make the header for the locate request
01540   output.write_ulong (request_id);
01541   output.write_ulong (status_info.status);
01542 
01543   if (status_info.status == TAO_GIOP_OBJECT_FORWARD)
01544     {
01545       CORBA::Object_ptr object_ptr = status_info.forward_location_var.in ();
01546 
01547       if ((output << object_ptr) == 0)
01548         {
01549           if (TAO_debug_level > 0)
01550             ACE_DEBUG ((LM_DEBUG,
01551                         ACE_TEXT ("TAO (%P|%t|%N|%l) make_locate_reply-")
01552                         ACE_TEXT ("cannot marshal object reference\n")));
01553         }
01554     }
01555 
01556   return 1;
01557 }

int TAO_GIOP_Message_Lite::write_locate_request_header CORBA::ULong  request_id,
TAO_Target_Specification spec,
TAO_OutputCDR msg
[private]
 

Write the LocateRequest header.

Definition at line 1308 of file GIOP_Message_Lite.cpp.

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

Referenced by generate_locate_request_header().

01313 {
01314   msg << request_id;
01315 
01316   // In this case we cannot recognise anything other than the Object
01317   // key as the address disposition variable. But we do a sanity check
01318   // anyway.
01319   const TAO::ObjectKey *key = spec.object_key ();
01320 
01321   if (key)
01322     {
01323       // Put in the object key
01324       msg << *key;
01325     }
01326     else
01327     {
01328       if (TAO_debug_level)
01329         {
01330           ACE_DEBUG ((
01331               LM_DEBUG,
01332               ACE_TEXT ("(%N |%l) Unable to handle this request \n")
01333             ));
01334         }
01335 
01336       return 0;
01337     }
01338 
01339   return 1;
01340 }

int TAO_GIOP_Message_Lite::write_protocol_header TAO_GIOP_Message_Type  t,
TAO_OutputCDR msg
[private]
 

Writes the GIOP header in to msg

Note:
If the GIOP header happens to change in the future, we can push this method in to the generator_parser classes.

Definition at line 710 of file GIOP_Message_Lite.cpp.

References ACE_OutputCDR::reset(), TAO_GIOP_Message_Type, ACE_OutputCDR::write_octet(), and ACE_OutputCDR::write_ulong().

Referenced by generate_locate_request_header(), generate_reply_header(), generate_request_header(), make_send_locate_reply(), and write_locate_reply_mesg().

00713 {
00714   // Reset the message type
00715   msg.reset ();
00716 
00717   // @@ Bala: this is something to think harder about:  right now we
00718   // leave the space to store the length, and later we set it, but the
00719   // way we do it is CDR specific...  Maybe the XXXStream classes
00720   // should support a 'save your current position' method that returns
00721   // a 'Mememto' (check the GoF book), later the CDR stream could be
00722   // restored to that state, and the size written to it.
00723   // @@ Then again, i don't know how would that work with fragments
00724   // (eventually we may want TAO to generate fragments), or protocols
00725   // based on chunking....
00726   //
00727   // Write a dummy <size> later it is set to the right value...  @@
00728   CORBA::ULong size = 0;
00729   msg.write_ulong (size);
00730 
00731   msg.write_octet ((CORBA::Octet) type);
00732 
00733   return 1;
00734 }

int TAO_GIOP_Message_Lite::write_reply_header TAO_OutputCDR output,
TAO_Pluggable_Reply_Params_Base reply
throw (CORBA::SystemException) [private]
 

Write the reply header in to .

Definition at line 1197 of file GIOP_Message_Lite.cpp.

References TAO_GIOP_LOCATION_FORWARD, TAO_GIOP_NO_EXCEPTION, TAO_GIOP_REPLY, TAO_GIOP_SYSTEM_EXCEPTION, TAO_GIOP_USER_EXCEPTION, TAO_PLUGGABLE_MESSAGE_LOCATION_FORWARD, TAO_PLUGGABLE_MESSAGE_NO_EXCEPTION, TAO_PLUGGABLE_MESSAGE_SYSTEM_EXCEPTION, and TAO_PLUGGABLE_MESSAGE_USER_EXCEPTION.

Referenced by generate_exception_reply(), generate_reply_header(), and send_reply_exception().

01203 {
01204   // Write the GIOP Lite header first
01205   this->write_protocol_header (TAO_GIOP_REPLY,
01206                                output);
01207 
01208   // Write the request ID
01209   output.write_ulong (reply.request_id_);
01210 
01211   // Write the reply status
01212   switch (reply.reply_status_)
01213     {
01214     case TAO_PLUGGABLE_MESSAGE_NO_EXCEPTION:
01215       output.write_ulong (TAO_GIOP_NO_EXCEPTION);
01216       break;
01217     case TAO_PLUGGABLE_MESSAGE_LOCATION_FORWARD:
01218       output.write_ulong (TAO_GIOP_LOCATION_FORWARD);
01219       break;
01220     case TAO_PLUGGABLE_MESSAGE_SYSTEM_EXCEPTION:
01221       output.write_ulong (TAO_GIOP_SYSTEM_EXCEPTION);
01222       break;
01223     case TAO_PLUGGABLE_MESSAGE_USER_EXCEPTION:
01224       output.write_ulong (TAO_GIOP_USER_EXCEPTION);
01225       break;
01226     default:
01227       // Some other specifc exception
01228       output.write_ulong (reply.reply_status_);
01229       break;
01230     }
01231 
01232   return 1;
01233 }

int TAO_GIOP_Message_Lite::write_request_header const TAO_Operation_Details opdetails,
TAO_Target_Specification spec,
TAO_OutputCDR msg
[private]
 

Write the request header in to .

Definition at line 1236 of file GIOP_Message_Lite.cpp.

References ACE_DEBUG, ACE_TEXT, LM_DEBUG, TAO_Target_Specification::object_key(), CORBA::Octet, TAO_Operation_Details::opname(), TAO_Operation_Details::opname_len(), TAO_Operation_Details::request_id(), TAO_Operation_Details::response_flags(), TAO_debug_level, TAO_TWOWAY_RESPONSE_FLAG, and ACE_OutputCDR::write_string().

Referenced by generate_request_header().

01241 {
01242   out_stream << opdetails.request_id ();
01243 
01244   const CORBA::Octet response_flags = opdetails.response_flags ();
01245 
01246   // @@ (JP) Temporary hack until all of GIOP 1.2 is implemented.
01247   if (response_flags == TAO_TWOWAY_RESPONSE_FLAG)
01248     {
01249       out_stream << ACE_OutputCDR::from_octet (1);
01250     }
01251   // Sync scope - ignored by server if request is not oneway.
01252   else if (response_flags == CORBA::Octet (Messaging::SYNC_WITH_TRANSPORT)
01253            || response_flags == CORBA::Octet (Messaging::SYNC_NONE)
01254            || response_flags == CORBA::Octet (TAO::SYNC_EAGER_BUFFERING)
01255            || response_flags == CORBA::Octet (TAO::SYNC_DELAYED_BUFFERING))
01256     {
01257       // No response required.
01258       out_stream << ACE_OutputCDR::from_octet (0);
01259     }
01260   else if (response_flags == CORBA::Octet (Messaging::SYNC_WITH_SERVER))
01261     {
01262       // Return before dispatching servant.  We're also setting the high
01263       // bit here. This is a temporary fix until the rest of GIOP 1.2 is
01264       // implemented in TAO.
01265       out_stream << ACE_OutputCDR::from_octet (129);
01266     }
01267   else if (response_flags == CORBA::Octet (Messaging::SYNC_WITH_TARGET))
01268     {
01269       // Return after dispatching servant.
01270       out_stream << ACE_OutputCDR::from_octet (3);
01271     }
01272   else
01273     {
01274       // Until more flags are defined by the OMG.
01275       return 0;
01276     }
01277 
01278   // In this case we cannot recognise anything other than the Object
01279   // key as the address disposition variable. But we do a sanity check
01280   // anyway.
01281   const TAO::ObjectKey *key = spec.object_key ();
01282 
01283   if (key != 0)
01284     {
01285       // Put in the object key
01286       out_stream << *key;
01287     }
01288     else
01289     {
01290       if (TAO_debug_level)
01291         {
01292           ACE_DEBUG ((
01293               LM_DEBUG,
01294               ACE_TEXT ("(%N |%l) Unable to handle this request \n")
01295             ));
01296         }
01297 
01298       return 0;
01299     }
01300 
01301   out_stream.write_string (opdetails.opname_len (),
01302                            opdetails.opname ());
01303 
01304   return 1;
01305 }


Member Data Documentation

CORBA::Octet TAO_GIOP_Message_Lite::byte_order_ [private]
 

The byte order..

Note:
GIOP lite cannot work between heterogenous platforms..

Definition at line 297 of file GIOP_Message_Lite.h.

Referenced by parse_incoming_messages().

TAO_OutputCDR TAO_GIOP_Message_Lite::cdr_ [private]
 

Definition at line 299 of file GIOP_Message_Lite.h.

Referenced by out_stream().

CORBA::ULong TAO_GIOP_Message_Lite::message_size_ [private]
 

The pay load size.

Definition at line 293 of file GIOP_Message_Lite.h.

Referenced by consolidate_node(), extract_next_message(), parse_incoming_messages(), parse_next_message(), and reset().

CORBA::Octet TAO_GIOP_Message_Lite::message_type_ [private]
 

The message type that we are going to process..

Definition at line 290 of file GIOP_Message_Lite.h.

Referenced by message_type(), parse_incoming_messages(), and reset().

TAO_ORB_Core* TAO_GIOP_Message_Lite::orb_core_ [private]
 

Our copy of the ORB core...

Definition at line 287 of file GIOP_Message_Lite.h.


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