00001
00002
00003
00004
00005 #include "Fragment.h"
00006
00007
00008
00009
00010
00011
00012
00013 namespace ACE_RMCast
00014 {
00015 Fragment::
00016 Fragment (Parameters const& params)
00017 : params_ (params),
00018 sn_ (1)
00019 {
00020 }
00021
00022 void Fragment::send (Message_ptr m)
00023 {
00024 if (Data const* data = static_cast<Data const*> (m->find (Data::id)))
00025 {
00026 size_t max_payload_size (
00027 params_.max_packet_size () - max_service_size);
00028
00029 if (data->size () <= max_payload_size)
00030 {
00031 u64 sn;
00032 {
00033 Lock l (mutex_);
00034 sn = sn_++;
00035 }
00036
00037 m->add (Profile_ptr (new SN (sn)));
00038
00039 out_->send (m);
00040 return;
00041 }
00042
00043 char const* p = data->buf ();
00044 size_t size (data->size ());
00045
00046
00047
00048 u32 packets (size / max_payload_size + (size % max_payload_size ? 1 : 0));
00049
00050
00051
00052
00053 for (u32 i (1); i <= packets; ++i)
00054 {
00055 Message_ptr part (new Message);
00056
00057 size_t s (i == packets ? size % max_payload_size : max_payload_size);
00058
00059
00060
00061 u64 sn;
00062 {
00063 Lock l (mutex_);
00064 sn = sn_++;
00065 }
00066
00067 part->add (Profile_ptr (new SN (sn)));
00068 part->add (Profile_ptr (new Part (i, packets, size)));
00069 part->add (Profile_ptr (new Data (p, s)));
00070
00071 out_->send (part);
00072
00073 p += s;
00074 }
00075 }
00076 }
00077 }