11 #define epicsExportSharedSymbols 26 public std::tr1::enable_shared_from_this<ChannelRPCServiceImpl>
29 Channel::shared_pointer m_channel;
30 ChannelRPCRequester::shared_pointer m_channelRPCRequester;
31 RPCServiceAsync::shared_pointer m_rpcService;
36 Channel::shared_pointer
const & channel,
37 ChannelRPCRequester::shared_pointer
const & channelRPCRequester,
38 RPCServiceAsync::shared_pointer
const & rpcService) :
40 m_channelRPCRequester(channelRPCRequester),
41 m_rpcService(rpcService),
53 epics::pvData::PVStructure::shared_pointer
const &
result 56 m_channelRPCRequester->requestDone(status, shared_from_this(), result);
58 if (m_lastRequest.
get())
62 virtual void request(epics::pvData::PVStructure::shared_pointer
const & pvArgument)
66 m_rpcService->request(pvArgument, shared_from_this());
68 catch (std::exception& ex)
73 m_channelRPCRequester->requestDone(errorStatus, shared_from_this(), PVStructure::shared_pointer());
75 if (m_lastRequest.
get())
82 "Unexpected exception caught while calling RPCServiceAsync.request(PVStructure, RPCResponseCallback).");
84 m_channelRPCRequester->requestDone(errorStatus, shared_from_this(), PVStructure::shared_pointer());
86 if (m_lastRequest.
get())
119 public std::tr1::enable_shared_from_this<RPCChannel>
125 ChannelProvider::shared_pointer m_provider;
126 string m_channelName;
127 ChannelRequester::shared_pointer m_channelRequester;
129 RPCServiceAsync::shared_pointer m_rpcService;
135 ChannelProvider::shared_pointer
const & provider,
136 string const & channelName,
137 ChannelRequester::shared_pointer
const & channelRequester,
138 RPCServiceAsync::shared_pointer
const & rpcService) :
139 m_provider(provider),
140 m_channelName(channelName),
141 m_channelRequester(channelRequester),
142 m_rpcService(rpcService)
159 return getChannelName();
164 return (!m_destroyed.
get()) ?
171 return m_channelName;
176 return m_channelRequester;
185 ChannelRPCRequester::shared_pointer
const & channelRPCRequester,
186 epics::pvData::PVStructure::shared_pointer
const & )
190 if (channelRPCRequester.get() == 0)
191 throw std::invalid_argument(
"channelRPCRequester == null");
193 if (m_destroyed.
get())
195 ChannelRPC::shared_pointer nullPtr;
201 std::tr1::shared_ptr<ChannelRPCServiceImpl> tp(
204 ChannelRPC::shared_pointer channelRPCImpl = tp;
205 channelRPCRequester->channelRPCConnect(
Status::Ok, channelRPCImpl);
206 return channelRPCImpl;
211 out <<
"RPCChannel: ";
212 out << getChannelName();
214 out << Channel::ConnectionStateNames[getConnectionState()];
220 return getChannelName();
230 std::string
const & channelName,
231 ChannelRequester::shared_pointer
const & channelRequester,
232 RPCServiceAsync::shared_pointer
const & rpcService)
235 std::tr1::shared_ptr<RPCChannel> tp(
236 new RPCChannel(provider, channelName, channelRequester, rpcService)
238 Channel::shared_pointer channel = tp;
246 public std::tr1::enable_shared_from_this<RPCChannelProvider> {
261 return PROVIDER_NAME;
266 return shared_from_this();
273 virtual ChannelFind::shared_pointer
channelFind(std::string
const & channelName,
274 ChannelFindRequester::shared_pointer
const & channelFindRequester)
279 found = (m_services.find(channelName) != m_services.end()) ||
280 findWildService(channelName);
282 ChannelFind::shared_pointer thisPtr(shared_from_this());
283 channelFindRequester->channelFindResult(
Status::Ok, thisPtr, found);
289 ChannelListRequester::shared_pointer
const & channelListRequester)
291 if (!channelListRequester.get())
292 throw std::runtime_error(
"null requester");
297 channelNames.
reserve(m_services.size());
298 for (RPCServiceMap::const_iterator iter = m_services.begin();
299 iter != m_services.end();
304 ChannelFind::shared_pointer thisPtr(shared_from_this());
305 channelListRequester->channelListResult(
Status::Ok, thisPtr, freeze(channelNames),
false);
310 std::string
const & channelName,
311 ChannelRequester::shared_pointer
const & channelRequester,
314 RPCServiceAsync::shared_pointer service;
316 RPCServiceMap::const_iterator iter;
319 iter = m_services.find(channelName);
321 if (iter != m_services.end())
322 service = iter->second;
326 service = findWildService(channelName);
330 Channel::shared_pointer nullChannel;
331 channelRequester->channelCreated(noSuchChannelStatus, nullChannel);
336 std::tr1::shared_ptr<RPCChannel> tp(
342 Channel::shared_pointer rpcChannel = tp;
343 channelRequester->channelCreated(
Status::Ok, rpcChannel);
348 std::string
const & ,
349 ChannelRequester::shared_pointer
const & ,
351 std::string
const & )
354 throw std::runtime_error(
"not supported");
357 void registerService(std::string
const & serviceName, RPCServiceAsync::shared_pointer
const & service)
360 m_services[serviceName] = service;
362 if (isWildcardPattern(serviceName))
363 m_wildServices.push_back(std::make_pair(serviceName, service));
369 m_services.erase(serviceName);
371 if (isWildcardPattern(serviceName))
373 for (RPCWildServiceList::iterator iter = m_wildServices.begin();
374 iter != m_wildServices.end();
376 if (iter->first == serviceName)
378 m_wildServices.erase(iter);
386 RPCServiceAsync::shared_pointer findWildService(
string const & wildcard)
388 if (!m_wildServices.empty())
389 for (RPCWildServiceList::iterator iter = m_wildServices.begin();
390 iter != m_wildServices.end();
392 if (Wildcard::wildcardfit(iter->first.c_str(), wildcard.c_str()))
395 return RPCServiceAsync::shared_pointer();
399 bool isWildcardPattern(
string const & pattern)
402 (pattern.find(
'*') != string::npos ||
403 pattern.find(
'?') != string::npos ||
404 (pattern.find(
'[') != string::npos && pattern.find(
']') != string::npos));
407 typedef std::map<string, RPCServiceAsync::shared_pointer> RPCServiceMap;
408 RPCServiceMap m_services;
410 typedef std::vector<std::pair<string, RPCServiceAsync::shared_pointer> > RPCWildServiceList;
411 RPCWildServiceList m_wildServices;
416 const string RPCChannelProvider::PROVIDER_NAME(
"rpcService");
420 RPCServer::RPCServer(
const Configuration::const_shared_pointer &conf)
425 .provider(m_channelProviderImpl));
436 std::cout << m_serverContext->getVersion().getVersionString() << std::endl;
437 m_serverContext->printInfo();
442 m_serverContext->run(seconds);
450 static void threadRunner(
void* usr)
464 param->server = shared_from_this();
465 param->timeToRun = seconds;
470 threadRunner, param.get());
478 m_serverContext->shutdown();
483 m_channelProviderImpl->registerService(serviceName, service);
488 m_channelProviderImpl->unregisterService(serviceName);
virtual std::tr1::shared_ptr< ChannelProvider > getChannelProvider()
virtual ChannelRPC::shared_pointer createChannelRPC(ChannelRPCRequester::shared_pointer const &channelRPCRequester, epics::pvData::PVStructure::shared_pointer const &)
A holder for a contiguous piece of memory.
#define epicsThreadPriorityMedium
static const string PROVIDER_NAME
virtual std::tr1::shared_ptr< ChannelRequester > getChannelRequester()
virtual Channel::shared_pointer getChannel()
virtual Channel::shared_pointer createChannel(std::string const &, ChannelRequester::shared_pointer const &, short, std::string const &)
void unregisterService(std::string const &serviceName)
TODO only here because of the Lockable.
virtual ChannelFind::shared_pointer channelFind(std::string const &channelName, ChannelFindRequester::shared_pointer const &channelFindRequester)
A lock for multithreading.
void unregisterService(std::string const &serviceName)
virtual void request(epics::pvData::PVStructure::shared_pointer const &pvArgument)
LIBCOM_API unsigned int epicsStdCall epicsThreadGetStackSize(epicsThreadStackSizeClass size)
epicsThreadId epicsStdCall epicsThreadCreate(const char *name, unsigned int priority, unsigned int stackSize, EPICSTHREADFUNC funptr, void *parm)
void registerService(std::string const &serviceName, RPCServiceAsync::shared_pointer const &service)
virtual std::tr1::shared_ptr< ChannelProvider > getProvider()
RPCChannel(ChannelProvider::shared_pointer const &provider, string const &channelName, ChannelRequester::shared_pointer const &channelRequester, RPCServiceAsync::shared_pointer const &rpcService)
void registerService(std::string const &serviceName, RPCServiceAsync::shared_pointer const &service)
#define POINTER_DEFINITIONS(clazz)
void push_back(param_type v)
ChannelRPCServiceImpl(Channel::shared_pointer const &channel, ChannelRPCRequester::shared_pointer const &channelRPCRequester, RPCServiceAsync::shared_pointer const &rpcService)
virtual void printInfo(std::ostream &out)
virtual string getRequesterName()
epicsShareFunc Channel::shared_pointer createRPCChannel(ChannelProvider::shared_pointer const &provider, std::string const &channelName, ChannelRequester::shared_pointer const &channelRequester, RPCServiceAsync::shared_pointer const &rpcService)
virtual AccessRights getAccessRights(epics::pvData::PVField::shared_pointer const &)
virtual ConnectionState getConnectionState()
virtual ChannelFind::shared_pointer channelList(ChannelListRequester::shared_pointer const &channelListRequester)
virtual std::string getChannelName()
virtual std::string getRemoteAddress()
virtual string getProviderName()
RPCServer::shared_pointer server
virtual Channel::shared_pointer createChannel(std::string const &channelName, ChannelRequester::shared_pointer const &channelRequester, short)
void runInNewThread(int seconds=0)
Options for a server insatnce.
static ServerContext::shared_pointer create(const Config &conf=Config())
virtual ~ChannelRPCServiceImpl()
static const Status noSuchChannelStatus
void reserve(size_t i)
Set array capacity.
virtual void requestDone(epics::pvData::Status const &status, epics::pvData::PVStructure::shared_pointer const &result)