On_Demand_Fragmentation_Strategy.cpp

Go to the documentation of this file.
00001 // $Id: On_Demand_Fragmentation_Strategy.cpp 79686 2007-09-21 08:33:21Z johnnyw $
00002 
00003 
00004 #include "tao/On_Demand_Fragmentation_Strategy.h"
00005 
00006 #include "tao/Transport.h"
00007 #include "tao/CDR.h"
00008 #include "tao/GIOP_Message_Base.h"
00009 #include "tao/debug.h"
00010 
00011 TAO_On_Demand_Fragmentation_Strategy::TAO_On_Demand_Fragmentation_Strategy (
00012   TAO_Transport * transport,
00013   CORBA::ULong max_message_size)
00014   : transport_ (transport)
00015   , max_message_size_ (max_message_size)
00016 {
00017 }
00018 
00019 TAO_On_Demand_Fragmentation_Strategy::~TAO_On_Demand_Fragmentation_Strategy (
00020   void)
00021 {
00022 }
00023 
00024 int
00025 TAO_On_Demand_Fragmentation_Strategy::fragment (
00026   TAO_OutputCDR & cdr,
00027   ACE_CDR::ULong pending_alignment,
00028   ACE_CDR::ULong pending_length)
00029 {
00030   if (this->transport_ == 0)
00031     return 0;  // No transport.  Can't fragment.
00032 
00033   TAO_GIOP_Message_Version giop_version;
00034 
00035   cdr.get_version (giop_version);
00036 
00037   // GIOP fragments are supported in GIOP 1.1 and better, but TAO only
00038   // supports them in 1.2 or better since GIOP 1.1 fragments do not
00039   // have a fragment message header.
00040   if (giop_version.major == 1 && giop_version.minor < 2)
00041     return -1;
00042 
00043   // Determine increase in CDR stream length if pending data is
00044   // marshaled, taking into account the alignment for the given data
00045   // type.
00046   ACE_CDR::ULong const total_pending_length =
00047     ACE_align_binary (cdr.total_length (), pending_alignment)
00048     + pending_length;
00049 
00050   // Except for the last fragment, fragmented GIOP messages must
00051   // always be aligned on an 8-byte boundary.  Padding will be added
00052   // if necessary.
00053   ACE_CDR::ULong const aligned_length =
00054     ACE_align_binary (total_pending_length, ACE_CDR::MAX_ALIGNMENT);
00055 
00056   // this->max_message_size_ must be >= 24 bytes, i.e.:
00057   //   12 for GIOP protocol header
00058   //  + 4 for GIOP fragment header
00059   //  + 8 for payload (including padding)
00060   // since fragments must be aligned on an 8 byte boundary.
00061   if (aligned_length > this->max_message_size_)
00062     {
00063       // Pad the outgoing fragment if necessary.
00064       if (cdr.align_write_ptr (ACE_CDR::MAX_ALIGNMENT) != 0)
00065         return -1;
00066 
00067       // More fragments to come.
00068       cdr.more_fragments (true);
00069 
00070       if (TAO_debug_level > 0)
00071         ACE_DEBUG ((LM_DEBUG,
00072                     "TAO (%P|%t) - On_Demand_Fragmentation_Strategy::fragment, "
00073                     "sending fragment of size %d\n",
00074                     cdr.total_length ()));
00075 
00076       // Send the current CDR stream contents through the transport,
00077       // making sure to switch on the the GIOP flags "more fragments"
00078       // bit.
00079       if (this->transport_->send_message (cdr,
00080                                           cdr.stub (),
00081                                           cdr.message_semantics (),
00082                                           cdr.timeout ()) == -1
00083 
00084           // Now generate a fragment header.
00085           || this->transport_->messaging_object ()->generate_fragment_header (
00086                cdr,
00087                cdr.request_id ()) != 0)
00088         return -1;
00089     }
00090 
00091   return 0;
00092 }

Generated on Tue Feb 2 17:37:52 2010 for TAO by  doxygen 1.4.7