Orocos Real-Time Toolkit
2.6.0
|
00001 /*************************************************************************** 00002 tag: The SourceWorks Tue Sep 7 00:55:18 CEST 2010 TaskContextI.cpp 00003 00004 TaskContextI.cpp - description 00005 ------------------- 00006 begin : Tue September 07 2010 00007 copyright : (C) 2010 The SourceWorks 00008 email : peter@thesourceworks.com 00009 00010 *************************************************************************** 00011 * This library is free software; you can redistribute it and/or * 00012 * modify it under the terms of the GNU General Public * 00013 * License as published by the Free Software Foundation; * 00014 * version 2 of the License. * 00015 * * 00016 * As a special exception, you may use this file as part of a free * 00017 * software library without restriction. Specifically, if other files * 00018 * instantiate templates or use macros or inline functions from this * 00019 * file, or you compile this file and link it with other files to * 00020 * produce an executable, this file does not by itself cause the * 00021 * resulting executable to be covered by the GNU General Public * 00022 * License. This exception does not however invalidate any other * 00023 * reasons why the executable file might be covered by the GNU General * 00024 * Public License. * 00025 * * 00026 * This library is distributed in the hope that it will be useful, * 00027 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00028 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 00029 * Lesser General Public License for more details. * 00030 * * 00031 * You should have received a copy of the GNU General Public * 00032 * License along with this library; if not, write to the Free Software * 00033 * Foundation, Inc., 59 Temple Place, * 00034 * Suite 330, Boston, MA 02111-1307 USA * 00035 * * 00036 ***************************************************************************/ 00037 00038 00039 // -*- C++ -*- 00040 // 00041 // $Id$ 00042 00043 // **** Code generated by the The ACE ORB (TAO) IDL Compiler **** 00044 // TAO and the TAO IDL Compiler have been developed by: 00045 // Center for Distributed Object Computing 00046 // Washington University 00047 // St. Louis, MO 00048 // USA 00049 // http://www.cs.wustl.edu/~schmidt/doc-center.html 00050 // and 00051 // Distributed Object Computing Laboratory 00052 // University of California at Irvine 00053 // Irvine, CA 00054 // USA 00055 // http://doc.ece.uci.edu/ 00056 // and 00057 // Institute for Software Integrated Systems 00058 // Vanderbilt University 00059 // Nashville, TN 00060 // USA 00061 // http://www.isis.vanderbilt.edu/ 00062 // 00063 // Information about TAO is available at: 00064 // http://www.cs.wustl.edu/~schmidt/TAO.html 00065 00066 // TAO_IDL - Generated from 00067 // ../../../ACE_wrappers/TAO/TAO_IDL/be/be_codegen.cpp:1196 00068 00069 #include "TaskContextI.h" 00070 #include "TaskContextServer.hpp" 00071 #include "TaskContextProxy.hpp" 00072 #include "ServiceI.h" 00073 #include "ServiceRequesterI.h" 00074 #include "DataFlowI.h" 00075 #include "../../OperationCaller.hpp" 00076 #include "../../rtt-detail-fwd.hpp" 00077 00078 00079 using namespace RTT; 00080 using namespace RTT::detail; 00081 using namespace RTT::corba; 00082 00083 // Implementation skeleton constructor 00084 RTT_corba_CTaskContext_i::RTT_corba_CTaskContext_i (RTT::TaskContext* orig, PortableServer::POA_ptr the_poa) 00085 : mpoa( PortableServer::POA::_duplicate(the_poa) ) 00086 , mtask( orig ), mRequest_i(0), mService_i(0) 00087 { 00088 // Add the corba object to the interface: 00089 mtask->addOperation("shutdown", &RTT_corba_CTaskContext_i::shutdownCORBA, this).doc("Shutdown CORBA ORB. This function makes RunOrb() return."); 00090 } 00091 00092 // Implementation skeleton destructor 00093 RTT_corba_CTaskContext_i::~RTT_corba_CTaskContext_i (void) 00094 { 00095 //CDataFlowInterface_i::deregisterServant(mtask->ports()); causes invalid read (freed already) 00096 } 00097 00098 void RTT_corba_CTaskContext_i::shutdownCORBA() { 00099 TaskContextServer::ShutdownOrb(false); 00100 } 00101 00102 char * RTT_corba_CTaskContext_i::getName ( 00103 void) 00104 { 00105 return CORBA::string_dup( mtask->getName().c_str() ); 00106 } 00107 00108 char * RTT_corba_CTaskContext_i::getDescription ( 00109 void) 00110 { 00111 return CORBA::string_dup( mtask->provides()->doc().c_str() ); 00112 } 00113 00114 ::RTT::corba::CTaskState RTT_corba_CTaskContext_i::getTaskState ( 00115 void) 00116 { 00117 return ::RTT::corba::CTaskState(mtask->getTaskState()); 00118 } 00119 00120 ::CORBA::Boolean RTT_corba_CTaskContext_i::configure ( 00121 void) 00122 { 00123 return mtask->configure(); 00124 } 00125 00126 ::CORBA::Boolean RTT_corba_CTaskContext_i::start ( 00127 void) 00128 { 00129 return mtask->start(); 00130 } 00131 00132 ::CORBA::Boolean RTT_corba_CTaskContext_i::activate ( 00133 void) 00134 { 00135 return mtask->activate(); 00136 } 00137 00138 ::CORBA::Boolean RTT_corba_CTaskContext_i::stop ( 00139 void) 00140 { 00141 return mtask->stop(); 00142 } 00143 00144 ::CORBA::Boolean RTT_corba_CTaskContext_i::cleanup ( 00145 void) 00146 { 00147 return mtask->cleanup(); 00148 } 00149 00150 ::CORBA::Boolean RTT_corba_CTaskContext_i::resetException ( 00151 void) 00152 { 00153 if (mtask->getTaskState() == RTT::TaskContext::Exception) 00154 return mtask->recover(); 00155 return false; 00156 } 00157 00158 ::CORBA::Boolean RTT_corba_CTaskContext_i::isActive ( 00159 void) 00160 { 00161 return mtask->isActive(); 00162 } 00163 00164 ::CORBA::Boolean RTT_corba_CTaskContext_i::isRunning ( 00165 void) 00166 { 00167 return mtask->isRunning(); 00168 } 00169 00170 ::CORBA::Boolean RTT_corba_CTaskContext_i::isConfigured ( 00171 void) 00172 { 00173 return mtask->isConfigured(); 00174 } 00175 00176 ::CORBA::Boolean RTT_corba_CTaskContext_i::inFatalError ( 00177 void) 00178 { 00179 return mtask->inFatalError(); 00180 } 00181 00182 ::CORBA::Boolean RTT_corba_CTaskContext_i::inRunTimeError ( 00183 void) 00184 { 00185 return mtask->inRunTimeError(); 00186 } 00187 00188 ::RTT::corba::CDataFlowInterface_ptr RTT_corba_CTaskContext_i::ports ( 00189 void) 00190 { 00191 return getProvider("this"); 00192 } 00193 00194 ::RTT::corba::CService_ptr RTT_corba_CTaskContext_i::getProvider ( 00195 const char * service_name) 00196 { 00197 if ( mtask->provides()->hasService(service_name) == false) 00198 return CService::_nil(); 00199 // Creates Service for "this" 00200 if ( CORBA::is_nil( mService ) ) { 00201 log(Debug) << "Creating CService for "<< mtask->getName()<<endlog(); 00202 RTT_corba_CService_i* mserv; 00203 mService_i = mserv = new RTT_corba_CService_i( mtask->provides(), mpoa ); 00204 mService = mserv->activate_this(); 00205 CDataFlowInterface_i::registerServant(CDataFlowInterface::_narrow(mService), mtask->provides().get()); 00206 } 00207 // Now the this service is available, check for the service name: 00208 std::string svc(service_name); 00209 if ( svc == "this" ) 00210 return ::RTT::corba::CService::_duplicate( mService.in() ); 00211 return mService->getService( service_name ); 00212 } 00213 00214 ::RTT::corba::CServiceRequester_ptr RTT_corba_CTaskContext_i::getRequester ( 00215 const char * service_name) 00216 { 00217 std::string svc(service_name); 00218 if ( mtask->requires()->requiresService(service_name) == false && svc != "this") 00219 return CServiceRequester::_nil(); 00220 // Creates service requester for "this" 00221 if ( CORBA::is_nil( mRequest ) ) { 00222 log(Debug) << "Creating CServiceRequester for "<< mtask->getName()<<endlog(); 00223 RTT_corba_CServiceRequester_i* mserv; 00224 mRequest_i = mserv = new RTT_corba_CServiceRequester_i( mtask->requires(), mpoa ); 00225 mRequest = mserv->activate_this(); 00226 //CServiceRequester_i::registerServant(mRequest, mtask->requires()); 00227 } 00228 // Now the this service is available, check for the service name: 00229 if ( svc == "this" ) 00230 return ::RTT::corba::CServiceRequester::_duplicate( mRequest.in() ); 00231 return mRequest->getRequest( service_name ); 00232 } 00233 00234 ::RTT::corba::CTaskContext::CPeerNames * RTT_corba_CTaskContext_i::getPeerList ( 00235 void) 00236 { 00237 TaskContext::PeerList peers = mtask->getPeerList(); 00238 ::RTT::corba::CTaskContext::CPeerNames_var result = new ::RTT::corba::CTaskContext::CPeerNames(); 00239 result->length( peers.size() ); 00240 for (unsigned int i=0; i != peers.size(); ++i ) 00241 result[i] = CORBA::string_dup( peers[i].c_str() ); 00242 00243 return result._retn(); 00244 } 00245 00246 ::RTT::corba::CTaskContext_ptr RTT_corba_CTaskContext_i::getPeer ( 00247 const char * name) 00248 { 00249 std::string pname(name); 00250 TaskContext* task = mtask->getPeer( pname ); 00251 if ( task ) { 00252 // create or lookup new server for this peer. 00253 // do not export it to the naming service. 00254 return TaskContextServer::CreateServer( task, false ); 00255 } 00256 return RTT::corba::CTaskContext::_nil(); 00257 } 00258 00259 ::CORBA::Boolean RTT_corba_CTaskContext_i::hasPeer ( 00260 const char * name) 00261 { 00262 std::string mname(name); 00263 return mtask->hasPeer(mname); 00264 } 00265 00266 ::CORBA::Boolean RTT_corba_CTaskContext_i::addPeer ( 00267 ::RTT::corba::CTaskContext_ptr p, 00268 const char * alias) 00269 { 00270 std::string malias(alias); 00271 if (mtask->hasPeer(alias) == false ) 00272 return mtask->addPeer( TaskContextProxy::Create(p), alias ); 00273 return false; 00274 } 00275 00276 ::CORBA::Boolean RTT_corba_CTaskContext_i::removePeer ( 00277 const char * name) 00278 { 00279 std::string mname(name); 00280 mtask->removePeer( mname ); 00281 return true; 00282 } 00283 00284 ::CORBA::Boolean RTT_corba_CTaskContext_i::connectPeers ( 00285 ::RTT::corba::CTaskContext_ptr p) 00286 { 00287 TaskContext* t = TaskContextProxy::Create( p ); 00288 return mtask->connectPeers( t ); 00289 } 00290 00291 ::CORBA::Boolean RTT_corba_CTaskContext_i::disconnectPeers ( 00292 const char * name) 00293 { 00294 std::string pname(name); 00295 mtask->disconnectPeers( pname ); 00296 return true; 00297 } 00298 00299 ::CORBA::Boolean RTT_corba_CTaskContext_i::connectPorts ( 00300 ::RTT::corba::CTaskContext_ptr p) 00301 { 00302 TaskContext* t = TaskContextProxy::Create( p ); 00303 return mtask->connectPorts( t ); 00304 } 00305 00306 ::CORBA::Boolean RTT_corba_CTaskContext_i::connectServices ( 00307 ::RTT::corba::CTaskContext_ptr p) 00308 { 00309 TaskContext* t = TaskContextProxy::Create( p ); 00310 return mtask->connectServices( t ); 00311 } 00312 00313