This is Unofficial EPICS BASE Doxygen Site
channelProviderLocal.cpp
Go to the documentation of this file.
1 /* channelProviderLocal.cpp */
12 #include <epicsThread.h>
13 #include <pv/serverContext.h>
14 #include <pv/syncChannelFind.h>
15 #include <pv/pvTimeStamp.h>
16 #include <pv/rpcService.h>
17 #include <pv/timeStamp.h>
18 
19 #define epicsExportSharedSymbols
20 #include "pv/pvStructureCopy.h"
21 #include "pv/pvDatabase.h"
23 
24 using namespace epics::pvData;
25 using namespace epics::pvAccess;
26 using namespace epics::pvCopy;
29 using std::cout;
30 using std::endl;
31 using std::string;
32 
33 namespace epics { namespace pvDatabase {
34 
35 static string providerName("local");
36 static ChannelProviderLocalPtr channelProvider;
37 
39 {
40 public:
42  virtual string getFactoryName() { return providerName;}
43  virtual ChannelProvider::shared_pointer sharedInstance()
44  {
45  if(!channelProvider) channelProvider = ChannelProviderLocalPtr(new ChannelProviderLocal());
46  return channelProvider;
47  }
48  virtual ChannelProvider::shared_pointer newInstance()
49  {
50  throw std::logic_error(
51  "LocalChannelProviderFactory::newInstance() not Implemented");
52  }
53 };
54 
55 
57 {
58  static int firstTime = 1;
59  if (firstTime) {
60  firstTime = 0;
61  ChannelProviderFactory::shared_pointer factory(
63  ChannelProviderRegistry::servers()->add(factory);
64  }
65  ChannelProvider::shared_pointer channelProvider =
66  ChannelProviderRegistry::servers()->getProvider(providerName);
68 }
69 
70 ChannelProviderLocal::ChannelProviderLocal()
71 : pvDatabase(PVDatabase::getMaster()),
72  traceLevel(0)
73 {
74  if(traceLevel>0) {
75  cout << "ChannelProviderLocal::ChannelProviderLocal()\n";
76  }
77 }
78 
80 {
81  if(traceLevel>0) {
82  cout << "ChannelProviderLocal::~ChannelProviderLocal()\n";
83  }
84 }
85 
86 std::tr1::shared_ptr<ChannelProvider> ChannelProviderLocal::getChannelProvider()
87 {
88  return shared_from_this();
89 }
90 
92 {
93  return providerName;
94 }
95 
96 ChannelFind::shared_pointer ChannelProviderLocal::channelFind(
97  string const & channelName,
98  ChannelFindRequester::shared_pointer const &channelFindRequester)
99 {
100  if(traceLevel>1) {
101  cout << "ChannelProviderLocal::channelFind " << "channelName" << endl;
102  }
103  PVDatabasePtr pvdb(pvDatabase.lock());
104  if(!pvdb) {
105  Status notFoundStatus(Status::STATUSTYPE_ERROR,"pvDatabase was deleted");
106  channelFindRequester->channelFindResult(
107  notFoundStatus,
108  shared_from_this(),
109  false);
110  }
111  PVRecordPtr pvRecord = pvdb->findRecord(channelName);
112  if(pvRecord) {
113  channelFindRequester->channelFindResult(
114  Status::Ok,
115  shared_from_this(),
116  true);
117 
118  } else {
119  Status notFoundStatus(Status::STATUSTYPE_ERROR,"pv not found");
120  channelFindRequester->channelFindResult(
121  notFoundStatus,
122  shared_from_this(),
123  false);
124  }
125  return shared_from_this();
126 }
127 
128 ChannelFind::shared_pointer ChannelProviderLocal::channelList(
129  ChannelListRequester::shared_pointer const & channelListRequester)
130 {
131  if(traceLevel>1) {
132  cout << "ChannelProviderLocal::channelList\n";
133  }
134  PVDatabasePtr pvdb(pvDatabase.lock());
135  if(!pvdb)throw std::logic_error("pvDatabase was deleted");
136  PVStringArrayPtr records(pvdb->getRecordNames());
137  channelListRequester->channelListResult(
138  Status::Ok, shared_from_this(), records->view(), false);
139  return shared_from_this();
140 }
141 
142 Channel::shared_pointer ChannelProviderLocal::createChannel(
143  string const & channelName,
144  ChannelRequester::shared_pointer const &channelRequester,
145  short priority)
146 {
147  if(traceLevel>1) {
148  cout << "ChannelProviderLocal::createChannel " << "channelName" << endl;
149  }
150  ChannelLocalPtr channel;
151  Status status = Status::Ok;
152  PVDatabasePtr pvdb(pvDatabase.lock());
153  if(!pvdb) {
154  status = Status::error("pvDatabase was deleted");
155  } else {
156  PVRecordPtr pvRecord = pvdb->findRecord(channelName);
157  if(pvRecord) {
158  channel = ChannelLocalPtr(new ChannelLocal(
159  shared_from_this(),channelRequester,pvRecord));
160  pvRecord->addPVRecordClient(channel);
161  } else {
162  status = Status::error("pv not found");
163  }
164  }
165  channelRequester->channelCreated(status,channel);
166  return channel;
167 }
168 
169 Channel::shared_pointer ChannelProviderLocal::createChannel(
170  string const & channelName,
171  ChannelRequester::shared_pointer const &channelRequester,
172  short priority,
173  string const &address)
174 {
175  if(!address.empty()) throw std::invalid_argument("address not allowed for local implementation");
176  return createChannel(channelName, channelRequester, priority);
177 }
178 
179 }}
pvd::Status status
epicsShareFunc ChannelProviderLocalPtr getChannelProviderLocal()
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:788
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
std::tr1::shared_ptr< PVStringArray > PVStringArrayPtr
Definition: pvData.h:1464
std::tr1::shared_ptr< ChannelLocal > ChannelLocalPtr
std::tr1::shared_ptr< PVDatabase > PVDatabasePtr
Definition: pvDatabase.h:43
virtual std::tr1::shared_ptr< ChannelProvider > getChannelProvider()
ChannelFind method.
Holds all PVA related.
Definition: pvif.h:34
pvData
Definition: monitor.h:428
#define POINTER_DEFINITIONS(clazz)
Definition: sharedPtr.h:198
std::tr1::shared_ptr< ChannelProviderLocal > ChannelProviderLocalPtr
Channel for accessing a PVRecord.
The interface for a database of PVRecords.
Definition: pvDatabase.h:475
virtual epics::pvAccess::ChannelFind::shared_pointer channelFind(std::string const &channelName, epics::pvAccess::ChannelFindRequester::shared_pointer const &channelFindRequester)
Returns either a null channelFind or a channelFind for records in the PVDatabase. ...
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21
virtual ChannelProvider::shared_pointer sharedInstance()
ChannelProvider for PVDatabase.
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:808
virtual std::string getProviderName()
Returns the channel provider name.
virtual epics::pvAccess::ChannelFind::shared_pointer channelList(epics::pvAccess::ChannelListRequester::shared_pointer const &channelListRequester)
Calls method channelListRequester::channelListResult.
virtual epics::pvAccess::Channel::shared_pointer createChannel(std::string const &channelName, epics::pvAccess::ChannelRequester::shared_pointer const &channelRequester, short priority)
Create a channel for a record.
C++ and C descriptions for a thread.
GLBLTYPE ELLLIST servers
Definition: server.h:193
virtual ChannelProvider::shared_pointer newInstance()