pvDatabaseCPP  4.7.1-dev
channelProviderLocal.cpp
Go to the documentation of this file.
1 /* channelProviderLocal.cpp */
12 #include <epicsThread.h>
13 #include <asLib.h>
14 #include <pv/serverContext.h>
15 #include <pv/syncChannelFind.h>
16 #include <pv/pvTimeStamp.h>
17 #include <pv/rpcService.h>
18 #include <pv/timeStamp.h>
19 
20 #define epicsExportSharedSymbols
21 #include "pv/pvStructureCopy.h"
22 #include "pv/pvDatabase.h"
24 
25 using namespace epics::pvData;
26 using namespace epics::pvAccess;
27 using namespace epics::pvCopy;
28 using std::tr1::static_pointer_cast;
29 using std::tr1::dynamic_pointer_cast;
30 using std::cout;
31 using std::endl;
32 using std::string;
33 
34 namespace epics { namespace pvDatabase {
35 
36 static string providerName("local");
37 static ChannelProviderLocalPtr channelProvider;
38 
39 class LocalChannelProviderFactory : public ChannelProviderFactory
40 {
41 public:
42  POINTER_DEFINITIONS(LocalChannelProviderFactory);
43  virtual string getFactoryName() { return providerName;}
44  virtual ChannelProvider::shared_pointer sharedInstance()
45  {
46  if(!channelProvider) channelProvider = ChannelProviderLocalPtr(new ChannelProviderLocal());
47  return channelProvider;
48  }
49  virtual ChannelProvider::shared_pointer newInstance()
50  {
51  throw std::logic_error(
52  "LocalChannelProviderFactory::newInstance() not Implemented");
53  }
54 };
55 
56 
58 {
59  static int firstTime = 1;
60  if (firstTime) {
61  firstTime = 0;
62  ChannelProviderFactory::shared_pointer factory(
63  new LocalChannelProviderFactory());
64  ChannelProviderRegistry::servers()->add(factory);
65  }
66  ChannelProvider::shared_pointer channelProvider =
67  ChannelProviderRegistry::servers()->getProvider(providerName);
68  return std::tr1::dynamic_pointer_cast<ChannelProviderLocal>(channelProvider);
69 }
70 
71 ChannelProviderLocal::ChannelProviderLocal()
72 : pvDatabase(PVDatabase::getMaster()),
73  traceLevel(0)
74 {
75  if(traceLevel>0) {
76  cout << "ChannelProviderLocal::ChannelProviderLocal()\n";
77  }
78 }
79 
81 {
82  if(traceLevel>0) {
83  cout << "ChannelProviderLocal::~ChannelProviderLocal()\n";
84  }
85 }
86 
87 std::tr1::shared_ptr<ChannelProvider> ChannelProviderLocal::getChannelProvider()
88 {
89  return shared_from_this();
90 }
91 
93 {
94  return providerName;
95 }
96 
97 ChannelFind::shared_pointer ChannelProviderLocal::channelFind(
98  string const & channelName,
99  ChannelFindRequester::shared_pointer const &channelFindRequester)
100 {
101  if(traceLevel>1) {
102  cout << "ChannelProviderLocal::channelFind " << "channelName" << endl;
103  }
104  PVDatabasePtr pvdb(pvDatabase.lock());
105  if(!pvdb) {
106  Status notFoundStatus(Status::STATUSTYPE_ERROR,"pvDatabase was deleted");
107  channelFindRequester->channelFindResult(
108  notFoundStatus,
109  shared_from_this(),
110  false);
111  }
112  PVRecordPtr pvRecord = pvdb->findRecord(channelName);
113  if(pvRecord) {
114  channelFindRequester->channelFindResult(
115  Status::Ok,
116  shared_from_this(),
117  true);
118 
119  } else {
120  Status notFoundStatus(Status::STATUSTYPE_ERROR,"pv not found");
121  channelFindRequester->channelFindResult(
122  notFoundStatus,
123  shared_from_this(),
124  false);
125  }
126  return shared_from_this();
127 }
128 
129 ChannelFind::shared_pointer ChannelProviderLocal::channelList(
130  ChannelListRequester::shared_pointer const & channelListRequester)
131 {
132  if(traceLevel>1) {
133  cout << "ChannelProviderLocal::channelList\n";
134  }
135  PVDatabasePtr pvdb(pvDatabase.lock());
136  if(!pvdb)throw std::logic_error("pvDatabase was deleted");
137  PVStringArrayPtr records(pvdb->getRecordNames());
138  channelListRequester->channelListResult(
139  Status::Ok, shared_from_this(), records->view(), false);
140  return shared_from_this();
141 }
142 
143 Channel::shared_pointer ChannelProviderLocal::createChannel(
144  string const & channelName,
145  ChannelRequester::shared_pointer const &channelRequester,
146  short priority)
147 {
148  if(traceLevel>1) {
149  cout << "ChannelProviderLocal::createChannel " << "channelName" << endl;
150  }
151  ChannelLocalPtr channel;
152  Status status = Status::Ok;
153  PVDatabasePtr pvdb(pvDatabase.lock());
154  if(!pvdb) {
155  status = Status::error("pvDatabase was deleted");
156  } else {
157  PVRecordPtr pvRecord = pvdb->findRecord(channelName);
158  if(pvRecord) {
159  channel = ChannelLocalPtr(new ChannelLocal(
160  shared_from_this(),channelRequester,pvRecord));
161  pvRecord->addPVRecordClient(channel);
162  } else {
163  status = Status::error("pv not found");
164  }
165  }
166  channelRequester->channelCreated(status,channel);
167  return channel;
168 }
169 
170 Channel::shared_pointer ChannelProviderLocal::createChannel(
171  string const & channelName,
172  ChannelRequester::shared_pointer const &channelRequester,
173  short priority,
174  string const &address)
175 {
176  if(!address.empty()) throw std::invalid_argument("address not allowed for local implementation");
177  return createChannel(channelName, channelRequester, priority);
178 }
179 
180 void ChannelProviderLocal::initAs(const std::string& filePath, const std::string& substitutions)
181 {
182  int status = asInitFile(filePath.c_str(), substitutions.c_str());
183  if(status) {
184  throw std::runtime_error("Invalid AS configuration.");
185  }
186 }
187 
189 {
190  return asActive;
191 }
192 
193 
194 }}
epicsShareFunc ChannelProviderLocalPtr getChannelProviderLocal()
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.
std::tr1::shared_ptr< ChannelProviderLocal > ChannelProviderLocalPtr
Channel for accessing a PVRecord.
The interface for a database of PVRecords.
Definition: pvDatabase.h:504
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
static bool isAsActive()
Is access security active?
ChannelProvider for PVDatabase.
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.
static void initAs(const std::string &filePath, const std::string &substitutions="")
Initialize access security configuration.
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.