00001
00029 #include <LoggerTransport.H>
00030 #include <CommsManager.H>
00031 #include <Logger.H>
00032
00033
00034
00035 using namespace WURDE;
00036
00037 LoggerTransport::LoggerTransport(const std::string & streamname){
00038 init(streamname,STRAT_NORMAL,"Any");
00039
00040
00041 m_haveGlobalname=false;
00042 }
00043
00044 LoggerTransport::LoggerTransport(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 LoggerTransport::LoggerTransport(const std::string &streamname,const std::string &gblName){
00059 init(streamname,STRAT_NORMAL,gblName);
00060 }
00061
00062 void LoggerTransport::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 LoggerTransport::~LoggerTransport(){
00103 myManager=NULL;
00104 if(myCOMObject){
00105
00106
00107 }
00108 }
00109
00110
00111 void LoggerTransport::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 data.priority=0;
00142 data.logData.clear();
00143 }else{
00144
00145
00146 m_initialize=true;
00147 m_supplier=true;
00148 }
00149
00150 requests=info;
00151
00152 }
00153
00154 void LoggerTransport::activateConsumer(){
00155 std::string localname;
00156
00157 if(m_haveStream){
00158 m_initialize=false;
00159 m_supplier=false;
00160 if(myCOMObject&&myManager){
00161
00162 if(!m_haveGlobalname&&m_strategy==STRAT_NORMAL){
00163 m_globalname=myManager->getName()+LOGGERTRANSPORT+m_streamname+"Consumer";
00164 m_haveGlobalname=true;
00165 }
00166
00167 myCOMObject->setGlobalName(m_globalname);
00168 myCOMObject->setStreamName(m_streamname);
00169 requests.source=m_globalname;
00170 data.source=m_streamname;
00171 info.source=m_streamname;
00172 myCOMObject->setInfo(&info);
00173 myCOMObject->setRequests(&requests);
00174 myCOMObject->setStaging(&data);
00175 myCOMObject->setAutoPing(m_doAutoPing);
00176 myCOMObject->activateConsumer();
00177 myCOMObject->setInfoVector(&m_infoVector);
00178 myCOMObject->setRequestVector(&m_requestVector);
00179 myCOMObject->setDataVector(&m_dataVector);
00180
00181 if(m_queue){
00182 myCOMObject->setQueueMode(true);
00183 }
00184 }else{
00185 g_fatal("Attempted to activateConsumer before setting a COMObject and CommsManager. Please use registerConsumer instead.");
00186 exit(-1);
00187 }
00188
00189 data.priority=0;
00190 data.logData.clear();
00191 }else{
00192
00193
00194 m_initialize=true;
00195 }
00196
00197 }
00198
00199 void LoggerTransport::runUpdate(){
00200 if(myCOMObject){
00201
00202 myCOMObject->runUpdate(m_doPublishData,m_doPublishInfo);
00203
00204 m_doPublishData=false;
00205 m_doPublishInfo=false;
00206
00207 }
00208 }
00209
00210 void LoggerTransport::setManager(CommsManager *myManager_){
00211
00212 if(!myCOMObject){
00213 myManager=myManager_;
00214 }
00215
00216 }
00217
00218 void LoggerTransport::setQueueMode(const bool & val){
00219
00220 if(!myCOMObject){
00221 m_queue=val;
00222 }else if(!m_queue&&val){
00223 m_queue=val;
00224 myCOMObject->setDataVector(&m_dataVector);
00225 myCOMObject->setQueueMode(true);
00226
00227 }else if(!val&&m_queue){
00228 m_queue=val;
00229 myCOMObject->setQueueMode(false);
00230 while(!m_dataVector.empty()){
00231 m_dataVector.pop();
00232 }
00233 while(!m_infoVector.empty()){
00234 m_infoVector.pop();
00235 }
00236 while(!m_requestVector.empty()){
00237 m_requestVector.pop();
00238 }
00239 }
00240 }
00241
00242 bool LoggerTransport::newData(){
00243 if(m_queue){
00244 return !m_dataVector.empty();
00245 }else{
00246 if(myCOMObject){
00247 return myCOMObject->newData();
00248 }
00249 }
00250
00251 return false;
00252 }
00253
00254 bool LoggerTransport::newInfo(){
00255 if(m_queue){
00256 if(m_supplier){
00257 return !m_requestVector.empty();
00258 }
00259
00260 return !m_infoVector.empty();
00261 }else{
00262 if(myCOMObject){
00263 return myCOMObject->newInfo();
00264 }
00265 }
00266
00267
00268 return false;
00269 }
00270
00271 void LoggerTransport::publishData(){
00272 if(m_supplier){
00273 if(m_doTimestamp){
00274 data.timestamp.now();
00275 }
00276 if(m_doTag){
00277 data.source=m_globalname;
00278 }
00279 if(m_queue){
00280 LoggerTransportDataStruct temp;
00281 temp.priority=0;
00282 temp.logData.clear();
00283 temp.priority=data.priority;
00284 temp.source=data.source;
00285 temp.logData=data.logData;
00286 temp.timestamp=data.timestamp;
00287 temp.logFormat=data.logFormat;
00288 temp.logString=data.logString;
00289
00290 m_dataVector.push(temp);
00291
00292 }
00293 m_doPublishData=true;
00294 }
00295 }
00296
00297 void LoggerTransport::publishInfo(){
00298 if(m_supplier){
00299
00300 info.mType=MESSAGE_INFO;
00301 if(m_doTimestamp){
00302 info.timestamp.now();
00303 }
00304
00305 if(m_doTag){
00306 info.source=m_globalname;
00307 info.target="Any";
00308 }
00309
00310 if(m_queue){
00311 LoggerTransportInfoStruct temp;
00312
00313
00314 temp.source=info.source;
00315 temp.target=info.target;
00316 temp.timestamp=info.timestamp;
00317 temp.mType=info.mType;
00318
00319 m_infoVector.push(temp);
00320
00321
00322 }
00323
00324 m_doPublishInfo=true;
00325 }else{
00326
00327 requests.mType=MESSAGE_REQUEST;
00328
00329 if(m_doTimestamp){
00330 requests.timestamp.now();
00331 }
00332
00333 if(m_doTag){
00334 requests.source=m_globalname;
00335 requests.target=m_streamname;
00336 }
00337
00338 if(m_queue){
00339 LoggerTransportInfoStruct temp;
00340 temp.source=requests.source;
00341 temp.target=requests.target;
00342 temp.timestamp=requests.timestamp;
00343 temp.mType=requests.mType;
00344
00345 m_requestVector.push(temp);
00346
00347
00348 }
00349
00350 m_doPublishInfo=true;
00351 }
00352 }
00353
00354 LoggerTransportDataStruct LoggerTransport::getNextData(){
00355 if(m_queue){
00356 LoggerTransportDataStruct retval;
00357 retval.priority=0;
00358 retval.logData.clear();
00359 retval.source="NULL";
00360 if(m_dataVector.empty()){
00361 return data;
00362 }
00363
00364 retval.priority=m_dataVector.front().priority;
00365 retval.source=m_dataVector.front().source;
00366 retval.logData=m_dataVector.front().logData;
00367 retval.timestamp=m_dataVector.front().timestamp;
00368 retval.logFormat=m_dataVector.front().logFormat;
00369 retval.logString=m_dataVector.front().logString;
00370
00371
00372 m_dataVector.pop();
00373 data=retval;
00374
00375 return retval;
00376 }else{
00377 myCOMObject->resetData();
00378 return data;
00379 }
00380 }
00381
00382 LoggerTransportInfoStruct LoggerTransport::getNextInfo(){
00383 if(m_queue){
00384 LoggerTransportInfoStruct retval;
00385 retval.source="NULL";
00386 if(m_supplier){
00387 if(m_requestVector.empty()){
00388 return requests;
00389 }
00390 retval.source=m_requestVector.front().source;
00391 retval.target=m_requestVector.front().target;
00392 retval.timestamp=m_requestVector.front().timestamp;
00393 retval.mType=m_requestVector.front().mType;
00394
00395
00396 m_requestVector.pop();
00397 requests=retval;
00398 return retval;
00399 }else{
00400 if(m_infoVector.empty()){
00401 return info;
00402 }
00403 retval.source=m_infoVector.front().source;
00404 retval.target=m_infoVector.front().target;
00405 retval.timestamp=m_infoVector.front().timestamp;
00406 retval.mType=m_infoVector.front().mType;
00407
00408 m_infoVector.pop();
00409 info=retval;
00410
00411
00412 requests=info;
00413
00414 return retval;
00415 }
00416 }else{
00417 myCOMObject->resetInfo();
00418 if(m_supplier){
00419 return requests;
00420 }else{
00421
00422
00423 requests=info;
00424 return info;
00425 }
00426 }
00427 }
00428
00429 void LoggerTransport::setStreamName(const std::string & name){
00430
00431 if(m_supplier&&name=="Any"){
00432 return;
00433 }
00434
00435 m_streamname=name;
00436 m_haveStream=true;
00437
00438 if(m_supplier){
00439 m_globalname=name;
00440 }
00441
00442 if(myCOMObject){
00443 myCOMObject->setStreamName(name);
00444 }
00445
00446 if(m_initialize){
00447 if(m_supplier){
00448 activateSupplier();
00449 }else{
00450 activateConsumer();
00451 }
00452 }
00453
00454 m_streamRequest=STAT_OKAY;
00455 }
00456
00457 void LoggerTransport::setGlobalName(const std::string & name){
00458
00459 if(name=="Any"){
00460 return;
00461 }
00462
00463 m_globalname=name;
00464 m_haveGlobalname=true;
00465 if(m_supplier){
00466 m_streamname=name;
00467 }
00468
00469 if(myCOMObject){
00470 myCOMObject->setGlobalName(name);
00471 }
00472 }
00473
00474 void LoggerTransport::doPing(){
00475 if(myCOMObject){
00476 myCOMObject->doPing();
00477 }
00478 }
00479
00480 void LoggerTransport::setAutoPing(const bool & val){
00481 m_doAutoPing=val;
00482 if(myCOMObject){
00483 myCOMObject->setAutoPing(val);
00484 }
00485 }
00486
00487