/home/fwph/code/wurde/rde/core/capabilities/LoggerTransport.cpp

Go to the documentation of this file.
00001 
00029 #include <LoggerTransport.H>
00030 #include <CommsManager.H>
00031 #include <Logger.H>
00032 
00033 // $Id: Type.cpp 68 2007-02-01 17:56:57Z fwph $
00034 
00035 using namespace WURDE;
00036 
00037 LoggerTransport::LoggerTransport(const std::string & streamname){
00038        init(streamname,STRAT_NORMAL,"Any");
00039 
00040        //global name will be set later
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               //then the global name really specifies the streamname,
00049               // and the global name should be assigned automagically once we have
00050               // confirmation that the stream has been started
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   //  data.source=streamname.c_str();
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          //      delete myCOMObject;
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                       //                     myCOMObject=new CMUIPCRobotProtocol::CMUIPCLoggerTransport(m_globalname);
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               //this shouldn't happen, but there's no real problem with it.
00145               //it'd just be dumb.
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                       /* global name so we don't have conflicts with the naming service */
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               //no stream, so we can't connect yet. tell the system 
00193               //to initialize as soon as we've got one
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                               //                     m_dataVector.push(data);
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                      //              m_infoVector.push(info);
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                      //              m_requestVector.push(requests);
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                        //             retval=m_dataVector.front();
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                               //                     retval=m_requestVector.front();
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                      // the requests struct really should get the values in 
00411                      // info
00412                      requests=info;
00413                      
00414                      return retval;
00415               }
00416        }else{
00417               myCOMObject->resetInfo();
00418               if(m_supplier){
00419                      return requests;
00420               }else{
00421                      // the requests struct really should get the values in 
00422                      // info
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 

Generated on Thu Feb 1 15:31:53 2007 for WURDE by  doxygen 1.5.1