00001
00029 #include <WallBuilder.H>
00030 #include <CommsManager.H>
00031 #include <Logger.H>
00032
00033
00034
00035 using namespace WURDE;
00036
00037 WallBuilder::WallBuilder(const std::string & streamname){
00038 init(streamname,STRAT_NORMAL,"Any");
00039
00040
00041 m_haveGlobalname=false;
00042 }
00043
00044 WallBuilder::WallBuilder(const ConnectionStrategy & strategy,const std::string & gblName){
00045 init("Any",strategy,gblName);
00046
00047 if(strategy==STRAT_NORMAL){
00048
00049
00050
00051 m_haveGlobalname=false;
00052 }
00053
00054 m_haveStream=false;
00055
00056 }
00057
00058 WallBuilder::WallBuilder(const std::string &streamname,const std::string &gblName){
00059 init(streamname,STRAT_NORMAL,gblName);
00060 }
00061
00062 void WallBuilder::init(const std::string &streamname,const ConnectionStrategy &strategy,const std::string &gblName){
00063 m_globalname=gblName;
00064 m_streamname=streamname;
00065
00066 myCOMObject=NULL;
00067
00068
00069 requests=info;
00070
00071 m_queue=false;
00072 m_supplier=false;
00073 m_doTimestamp=true;
00074 m_doTag=true;
00075
00076 m_doPublishData=false;
00077 m_doPublishInfo=false;
00078
00079 m_initialize=false;
00080 m_strategy=strategy;
00081
00082 m_haveStream=true;
00083 m_haveGlobalname=true;
00084 m_doPublishData=false;
00085 m_doPublishInfo=false;
00086
00087 m_doAutoPing=true;
00088
00089 info.source=streamname;
00090 requests.source=m_globalname;
00091 info.target="Any";
00092 requests.target=streamname;
00093 info.timestamp.now();
00094 requests.timestamp.now();
00095
00096 m_streamRequest=STAT_NULL;
00097
00098 m_sourceModule="Unknown";
00099 }
00100
00101
00102 WallBuilder::~WallBuilder(){
00103 myManager=NULL;
00104 if(myCOMObject){
00105
00106
00107 }
00108 }
00109
00110
00111 void WallBuilder::activateSupplier(){
00112 if(m_haveStream){
00113 m_supplier=true;
00114 m_globalname=m_streamname;
00115 m_haveGlobalname=true;
00116 m_initialize=false;
00117 if(myCOMObject){
00118
00119 myCOMObject->setGlobalName(m_globalname);
00120 myCOMObject->setStreamName(m_streamname);
00121 myCOMObject->setInfo(&requests);
00122 myCOMObject->setRequests(&info);
00123 myCOMObject->setStaging(&data);
00124 myCOMObject->activateSupplier();
00125 myCOMObject->setAutoPing(m_doAutoPing);
00126 myCOMObject->setInfoVector(&m_requestVector);
00127 myCOMObject->setRequestVector(&m_infoVector);
00128 myCOMObject->setDataVector(&m_dataVector);
00129
00130 data.source=m_streamname;
00131 info.source=m_streamname;
00132
00133 if(m_queue){
00134 myCOMObject->setQueueMode(true);
00135 }
00136
00137 }else{
00138 g_fatal("Attempted to activateSupplier before setting a COMObject Please just use registerSupplier.");
00139 exit(-1);
00140 }
00141 if(m_supplier){
00142 info.deleteWalls.setCMode(C_SUPPLIER);
00143 }else{
00144 info.deleteWalls.setCMode(C_CONSUMER);
00145 }
00146 if(m_supplier){
00147 info.wallList.setCMode(C_SUPPLIER);
00148 }else{
00149 info.wallList.setCMode(C_CONSUMER);
00150 }
00151 }else{
00152
00153
00154 m_initialize=true;
00155 m_supplier=true;
00156 }
00157
00158 requests=info;
00159
00160 }
00161
00162 void WallBuilder::activateConsumer(){
00163 std::string localname;
00164
00165 if(m_haveStream){
00166 m_initialize=false;
00167 m_supplier=false;
00168 if(myCOMObject&&myManager){
00169
00170 if(!m_haveGlobalname&&m_strategy==STRAT_NORMAL){
00171 m_globalname=myManager->getName()+WALLBUILDER+m_streamname+"Consumer";
00172 m_haveGlobalname=true;
00173 }
00174
00175 myCOMObject->setGlobalName(m_globalname);
00176 myCOMObject->setStreamName(m_streamname);
00177 requests.source=m_globalname;
00178 data.source=m_streamname;
00179 info.source=m_streamname;
00180 myCOMObject->setInfo(&info);
00181 myCOMObject->setRequests(&requests);
00182 myCOMObject->setStaging(&data);
00183 myCOMObject->setAutoPing(m_doAutoPing);
00184 myCOMObject->activateConsumer();
00185 myCOMObject->setInfoVector(&m_infoVector);
00186 myCOMObject->setRequestVector(&m_requestVector);
00187 myCOMObject->setDataVector(&m_dataVector);
00188
00189 if(m_queue){
00190 myCOMObject->setQueueMode(true);
00191 }
00192 }else{
00193 g_fatal("Attempted to activateConsumer before setting a COMObject and CommsManager. Please use registerConsumer instead.");
00194 exit(-1);
00195 }
00196
00197 if(m_supplier){
00198 info.deleteWalls.setCMode(C_SUPPLIER);
00199 }else{
00200 info.deleteWalls.setCMode(C_CONSUMER);
00201 }
00202 if(m_supplier){
00203 info.wallList.setCMode(C_SUPPLIER);
00204 }else{
00205 info.wallList.setCMode(C_CONSUMER);
00206 }
00207 }else{
00208
00209
00210 m_initialize=true;
00211 }
00212
00213 }
00214
00215 void WallBuilder::runUpdate(){
00216 if(myCOMObject){
00217
00218 myCOMObject->runUpdate(m_doPublishData,m_doPublishInfo);
00219
00220 m_doPublishData=false;
00221 m_doPublishInfo=false;
00222
00223 }
00224 }
00225
00226 void WallBuilder::setManager(CommsManager *myManager_){
00227
00228 if(!myCOMObject){
00229 myManager=myManager_;
00230 }
00231
00232 }
00233
00234 void WallBuilder::setQueueMode(const bool & val){
00235
00236 if(!myCOMObject){
00237 m_queue=val;
00238 }else if(!m_queue&&val){
00239 m_queue=val;
00240 myCOMObject->setDataVector(&m_dataVector);
00241 myCOMObject->setQueueMode(true);
00242
00243 }else if(!val&&m_queue){
00244 m_queue=val;
00245 myCOMObject->setQueueMode(false);
00246 while(!m_dataVector.empty()){
00247 m_dataVector.pop();
00248 }
00249 while(!m_infoVector.empty()){
00250 m_infoVector.pop();
00251 }
00252 while(!m_requestVector.empty()){
00253 m_requestVector.pop();
00254 }
00255 }
00256 }
00257
00258 bool WallBuilder::newData(){
00259 if(m_queue){
00260 return !m_dataVector.empty();
00261 }else{
00262 if(myCOMObject){
00263 return myCOMObject->newData();
00264 }
00265 }
00266
00267 return false;
00268 }
00269
00270 bool WallBuilder::newInfo(){
00271 if(m_queue){
00272 if(m_supplier){
00273 return !m_requestVector.empty();
00274 }
00275
00276 return !m_infoVector.empty();
00277 }else{
00278 if(myCOMObject){
00279 return myCOMObject->newInfo();
00280 }
00281 }
00282
00283
00284 return false;
00285 }
00286
00287 void WallBuilder::publishData(){
00288 if(m_supplier){
00289 if(m_doTimestamp){
00290 data.timestamp.now();
00291 }
00292 if(m_doTag){
00293 data.source=m_globalname;
00294 }
00295 if(m_queue){
00296 WallBuilderDataStruct temp;
00297 temp.source=data.source;
00298 temp.timestamp=data.timestamp;
00299
00300 m_dataVector.push(temp);
00301
00302 }
00303 m_doPublishData=true;
00304 }
00305 }
00306
00307 void WallBuilder::publishInfo(){
00308 if(m_supplier){
00309
00310 info.mType=MESSAGE_INFO;
00311 if(m_doTimestamp){
00312 info.timestamp.now();
00313 }
00314
00315 if(m_doTag){
00316 info.source=m_globalname;
00317 info.target="Any";
00318 }
00319
00320 if(m_queue){
00321 WallBuilderInfoStruct temp;
00322
00323
00324 temp.deleteWalls=info.deleteWalls;
00325 temp.source=info.source;
00326 temp.target=info.target;
00327 temp.wallList=info.wallList;
00328 temp.timestamp=info.timestamp;
00329 temp.mType=info.mType;
00330
00331 m_infoVector.push(temp);
00332
00333
00334 }
00335
00336 m_doPublishInfo=true;
00337 }else{
00338
00339 requests.mType=MESSAGE_REQUEST;
00340
00341 if(m_doTimestamp){
00342 requests.timestamp.now();
00343 }
00344
00345 if(m_doTag){
00346 requests.source=m_globalname;
00347 requests.target=m_streamname;
00348 }
00349
00350 if(m_queue){
00351 WallBuilderInfoStruct temp;
00352 if(m_supplier){
00353 temp.deleteWalls.setCMode(C_SUPPLIER);
00354 }else{
00355 temp.deleteWalls.setCMode(C_CONSUMER);
00356 }
00357 if(m_supplier){
00358 temp.wallList.setCMode(C_SUPPLIER);
00359 }else{
00360 temp.wallList.setCMode(C_CONSUMER);
00361 }
00362 temp.deleteWalls=requests.deleteWalls;
00363 temp.source=requests.source;
00364 temp.target=requests.target;
00365 temp.wallList=requests.wallList;
00366 temp.timestamp=requests.timestamp;
00367 temp.mType=requests.mType;
00368
00369 m_requestVector.push(temp);
00370
00371
00372 }
00373
00374 m_doPublishInfo=true;
00375 }
00376 }
00377
00378 WallBuilderDataStruct WallBuilder::getNextData(){
00379 if(m_queue){
00380 WallBuilderDataStruct retval;
00381 retval.source="NULL";
00382 if(m_dataVector.empty()){
00383 return data;
00384 }
00385
00386 retval.source=m_dataVector.front().source;
00387 retval.timestamp=m_dataVector.front().timestamp;
00388
00389
00390 m_dataVector.pop();
00391 data=retval;
00392
00393 return retval;
00394 }else{
00395 myCOMObject->resetData();
00396 return data;
00397 }
00398 }
00399
00400 WallBuilderInfoStruct WallBuilder::getNextInfo(){
00401 if(m_queue){
00402 WallBuilderInfoStruct retval;
00403 if(m_supplier){
00404 retval.deleteWalls.setCMode(C_SUPPLIER);
00405 }else{
00406 retval.deleteWalls.setCMode(C_CONSUMER);
00407 }
00408 if(m_supplier){
00409 retval.wallList.setCMode(C_SUPPLIER);
00410 }else{
00411 retval.wallList.setCMode(C_CONSUMER);
00412 }
00413 retval.source="NULL";
00414 if(m_supplier){
00415 if(m_requestVector.empty()){
00416 return requests;
00417 }
00418 retval.deleteWalls=m_requestVector.front().deleteWalls;
00419 retval.source=m_requestVector.front().source;
00420 retval.target=m_requestVector.front().target;
00421 retval.wallList=m_requestVector.front().wallList;
00422 retval.timestamp=m_requestVector.front().timestamp;
00423 retval.mType=m_requestVector.front().mType;
00424
00425
00426 if(m_supplier){
00427 retval.deleteWalls.setCMode(C_SUPPLIER);
00428 }else{
00429 retval.deleteWalls.setCMode(C_CONSUMER);
00430 }
00431 if(m_supplier){
00432 retval.wallList.setCMode(C_SUPPLIER);
00433 }else{
00434 retval.wallList.setCMode(C_CONSUMER);
00435 }
00436 m_requestVector.pop();
00437 requests=retval;
00438 return retval;
00439 }else{
00440 if(m_infoVector.empty()){
00441 return info;
00442 }
00443 retval.deleteWalls=m_infoVector.front().deleteWalls;
00444 retval.source=m_infoVector.front().source;
00445 retval.target=m_infoVector.front().target;
00446 retval.wallList=m_infoVector.front().wallList;
00447 retval.timestamp=m_infoVector.front().timestamp;
00448 retval.mType=m_infoVector.front().mType;
00449
00450 if(m_supplier){
00451 retval.deleteWalls.setCMode(C_SUPPLIER);
00452 }else{
00453 retval.deleteWalls.setCMode(C_CONSUMER);
00454 }
00455 if(m_supplier){
00456 retval.wallList.setCMode(C_SUPPLIER);
00457 }else{
00458 retval.wallList.setCMode(C_CONSUMER);
00459 }
00460 m_infoVector.pop();
00461 info=retval;
00462
00463
00464 requests=info;
00465
00466 return retval;
00467 }
00468 }else{
00469 myCOMObject->resetInfo();
00470 if(m_supplier){
00471 if(m_supplier){
00472 requests.deleteWalls.setCMode(C_SUPPLIER);
00473 }else{
00474 requests.deleteWalls.setCMode(C_CONSUMER);
00475 }
00476 if(m_supplier){
00477 requests.wallList.setCMode(C_SUPPLIER);
00478 }else{
00479 requests.wallList.setCMode(C_CONSUMER);
00480 }
00481 return requests;
00482 }else{
00483 if(m_supplier){
00484 info.deleteWalls.setCMode(C_SUPPLIER);
00485 }else{
00486 info.deleteWalls.setCMode(C_CONSUMER);
00487 }
00488 if(m_supplier){
00489 info.wallList.setCMode(C_SUPPLIER);
00490 }else{
00491 info.wallList.setCMode(C_CONSUMER);
00492 }
00493
00494
00495 requests=info;
00496 return info;
00497 }
00498 }
00499 }
00500
00501 void WallBuilder::setStreamName(const std::string & name){
00502
00503 if(m_supplier&&name=="Any"){
00504 return;
00505 }
00506
00507 m_streamname=name;
00508 m_haveStream=true;
00509
00510 if(m_supplier){
00511 m_globalname=name;
00512 }
00513
00514 if(myCOMObject){
00515 myCOMObject->setStreamName(name);
00516 }
00517
00518 if(m_initialize){
00519 if(m_supplier){
00520 activateSupplier();
00521 }else{
00522 activateConsumer();
00523 }
00524 }
00525
00526 m_streamRequest=STAT_OKAY;
00527 }
00528
00529 void WallBuilder::setGlobalName(const std::string & name){
00530
00531 if(name=="Any"){
00532 return;
00533 }
00534
00535 m_globalname=name;
00536 m_haveGlobalname=true;
00537 if(m_supplier){
00538 m_streamname=name;
00539 }
00540
00541 if(myCOMObject){
00542 myCOMObject->setGlobalName(name);
00543 }
00544 }
00545
00546 void WallBuilder::doPing(){
00547 if(myCOMObject){
00548 myCOMObject->doPing();
00549 }
00550 }
00551
00552 void WallBuilder::setAutoPing(const bool & val){
00553 m_doAutoPing=val;
00554 if(myCOMObject){
00555 myCOMObject->setAutoPing(val);
00556 }
00557 }
00558
00559