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::
00023 send (Message_ptr m)
00024 {
00025 if (Data const* data = static_cast<Data const*> (m->find (Data::id)))
00026 {
00027 size_t max_payload_size (
00028 params_.max_packet_size () - max_service_size);
00029
00030 if (data->size () <= max_payload_size)
00031 {
00032 u64 sn;
00033 {
00034 Lock l (mutex_);
00035 sn = sn_++;
00036 }
00037
00038 m->add (Profile_ptr (new SN (sn)));
00039
00040 out_->send (m);
00041 return;
00042 }
00043
00044 char const* p = data->buf ();
00045 size_t size (data->size ());
00046
00047
00048
00049 u32 packets (size / max_payload_size + (size % max_payload_size ? 1 : 0));
00050
00051
00052
00053
00054 for (u32 i (1); i <= packets; ++i)
00055 {
00056 Message_ptr part (new Message);
00057
00058 size_t s (i == packets ? size % max_payload_size : max_payload_size);
00059
00060
00061
00062 u64 sn;
00063 {
00064 Lock l (mutex_);
00065 sn = sn_++;
00066 }
00067
00068 part->add (Profile_ptr (new SN (sn)));
00069 part->add (Profile_ptr (new Part (i, packets, size)));
00070 part->add (Profile_ptr (new Data (p, s)));
00071
00072 out_->send (part);
00073
00074 p += s;
00075 }
00076 }
00077 }
00078 }