00001
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;
00032
00033 TAO_GIOP_Message_Version giop_version;
00034
00035 cdr.get_version (giop_version);
00036
00037
00038
00039
00040 if (giop_version.major == 1 && giop_version.minor < 2)
00041 return -1;
00042
00043
00044
00045
00046 ACE_CDR::ULong const total_pending_length =
00047 ACE_align_binary (cdr.total_length (), pending_alignment)
00048 + pending_length;
00049
00050
00051
00052
00053 ACE_CDR::ULong const aligned_length =
00054 ACE_align_binary (total_pending_length, ACE_CDR::MAX_ALIGNMENT);
00055
00056
00057
00058
00059
00060
00061 if (aligned_length > this->max_message_size_)
00062 {
00063
00064 if (cdr.align_write_ptr (ACE_CDR::MAX_ALIGNMENT) != 0)
00065 return -1;
00066
00067
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
00077
00078
00079 if (this->transport_->send_message (cdr,
00080 cdr.stub (),
00081 cdr.message_semantics (),
00082 cdr.timeout ()) == -1
00083
00084
00085 || this->transport_->messaging_object ()->generate_fragment_header (
00086 cdr,
00087 cdr.request_id ()) != 0)
00088 return -1;
00089 }
00090
00091 return 0;
00092 }