Savarese Software Research Corporation
ScatterMessage.cc
Go to the documentation of this file.
00001 /*
00002  *
00003  * Copyright 2006,2007 Savarese Software Research Corporation
00004  *
00005  * Licensed under the Apache License, Version 2.0 (the "License");
00006  * you may not use this file except in compliance with the License.
00007  * You may obtain a copy of the License at
00008  *
00009  *     http://www.savarese.com/software/ApacheLicense-2.0
00010  *
00011  * Unless required by applicable law or agreed to in writing, software
00012  * distributed under the License is distributed on an "AS IS" BASIS,
00013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00014  * See the License for the specific language governing permissions and
00015  * limitations under the License.
00016  */
00017 
00018 #include <ssrc/spread/ScatterMessage.h>
00019 
00020 __BEGIN_NS_SSRC_SPREAD
00021 
00028 void ScatterMessage::init_pre_receive() {
00029   int size = _messages.size();
00030 
00031   for(int i = 0; i < size; ++i) {
00032     value_type & value = _messages[i];
00033     Message *m = value.first;
00034 
00035     if(value.second >= _scatter.num_elements)
00036       break;
00037 
00038     _size-=m->size();
00039     m->resize(m->capacity());
00040     _size+=m->size();
00041     _scatter.elements[value.second].len = m->size();
00042   }
00043 }
00044 
00055 void ScatterMessage::init_post_receive(int bytes_received) {
00056   int index = 0, i, len;
00057   int size = _messages.size();
00058   Message *m;
00059 
00060   if(bytes_received > 0)
00061     _size = bytes_received;
00062   else
00063     _size = 0;
00064 
00065   for(i = 0; i < size && bytes_received > 0; ++i) {
00066     value_type & value = _messages[i];
00067     int mindex = value.second;
00068     if(mindex >= _scatter.num_elements)
00069       break;
00070 
00071     while(index < mindex)
00072       bytes_received-=_scatter.elements[index++].len;
00073 
00074     if(bytes_received <= 0)
00075       break;
00076 
00077     len = _scatter.elements[mindex].len;
00078     m   = value.first;
00079 
00080     m->set_type(type());
00081     m->set_service(service());
00082     m->set_endian_mismatch(endian_mismatch());
00083     m->set_sender(_sender);
00084 
00085     if(len <= bytes_received)
00086       m->resize(len);
00087     else
00088       m->resize(bytes_received);
00089 
00090     bytes_received-=len;
00091   }
00092 
00093   // Anything left over gets a size of zero.
00094   for(; i < size; ++i) {
00095     m = _messages[i].first;
00096     m->resize(0);
00097     m->set_type(type());
00098     m->set_service(service());
00099     m->set_endian_mismatch(endian_mismatch());
00100     m->set_sender(_sender);
00101   }
00102 }
00103 
00115 bool ScatterMessage::add(const void *data, const unsigned int size) {
00116   int i = _scatter.num_elements;
00117 
00118   if(i >= MaxScatterElements)
00119     return false;
00120 
00121   ++_scatter.num_elements;
00122   _scatter.elements[i].buf = 
00123     const_cast<char *>(static_cast<const char *>(data));
00124   _scatter.elements[i].len = size;
00125   _size+=size;
00126 
00127   return true;
00128 }
00129 
00130 __END_NS_SSRC_SPREAD

Savarese Software Research Corporation
Copyright © 2006-2011 Savarese Software Research Corporation. All rights reserved.