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/Pluggable_Messaging.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 CORBA::Octet major = 0;
00034 CORBA::Octet minor = 0;
00035
00036 (void) cdr.get_version (major, minor);
00037
00038
00039
00040
00041 if (major == 1 && minor < 2)
00042 return -1;
00043
00044
00045
00046
00047 ACE_CDR::ULong const total_pending_length =
00048 ACE_align_binary (cdr.total_length (), pending_alignment)
00049 + pending_length;
00050
00051
00052
00053
00054 ACE_CDR::ULong const aligned_length =
00055 ACE_align_binary (total_pending_length, ACE_CDR::MAX_ALIGNMENT);
00056
00057
00058
00059
00060
00061
00062 if (aligned_length > this->max_message_size_)
00063 {
00064
00065 if (cdr.align_write_ptr (ACE_CDR::MAX_ALIGNMENT) != 0)
00066 return -1;
00067
00068
00069 cdr.more_fragments (true);
00070
00071 if (TAO_debug_level > 0)
00072 ACE_DEBUG ((LM_DEBUG,
00073 "TAO (%P|%t) - On_Demand_Fragmentation_Strategy::fragment, "
00074 "sending fragment of size %d\n",
00075 cdr.total_length ()));
00076
00077
00078
00079
00080 if (this->transport_->send_message (cdr,
00081 cdr.stub (),
00082 cdr.message_semantics (),
00083 cdr.timeout ()) == -1
00084
00085
00086 || this->transport_->messaging_object ()->generate_fragment_header (
00087 cdr,
00088 cdr.request_id ()) != 0)
00089 return -1;
00090 }
00091
00092 return 0;
00093 }