Fragment.cpp

Go to the documentation of this file.
00001 // file      : ace/RMCast/Fragment.cpp
00002 // author    : Boris Kolpackov <boris@kolpackov.net>
00003 // cvs-id    : Fragment.cpp,v 1.4 2005/07/18 13:18:25 boris Exp
00004 
00005 #include "Fragment.h"
00006 
00007 /*
00008 #include <iostream>
00009 using std::cerr;
00010 using std::endl;
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       // Need fragmentation.
00048       //
00049       u32 packets (size / max_payload_size + (size % max_payload_size ? 1 : 0));
00050 
00051       // cerr << "size : " << size << endl
00052       //      << "packs: " << packets << endl;
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         // cerr << "pack: " << s << endl;
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 }

Generated on Thu Nov 9 11:40:40 2006 for ACE_RMCast by doxygen 1.3.6