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    : $Id: Fragment.cpp 78774 2007-07-04 06:06:59Z sowayaa $
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::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       // Need fragmentation.
00047       //
00048       u32 packets (size / max_payload_size + (size % max_payload_size ? 1 : 0));
00049 
00050       // cerr << "size : " << size << endl
00051       //      << "packs: " << packets << endl;
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         // cerr << "pack: " << s << endl;
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 }

Generated on Sun Jan 27 13:02:56 2008 for ACE_RMCast by doxygen 1.3.6