22 #define epicsExportSharedSymbols 32 const pva::ChannelProvider::shared_pointer provider,
33 const std::string& channelName,
34 const requester_type::shared_pointer&
requester)
36 ,channelName(channelName)
43 if(owner->debugLvl>5) {
45 requester->getRequesterName().c_str(),
51 Guard G(owner->mutex);
52 owner->channels.push_back(
this);
64 std::tr1::shared_ptr<SharedPV::Handler> handler;
71 bool wasempty =
owner->channels.empty();
72 owner->channels.remove(
this);
73 if(!wasempty &&
owner->channels.empty() &&
owner->notifiedConn) {
74 handler =
owner->handler;
75 owner->notifiedConn =
false;
79 handler->onLastDisconnect(
owner);
83 pva::ChannelRequester::shared_pointer req(
requester.lock());
85 req ? req->getRequesterName().c_str() :
"<Defunct>",
115 SharedPV::Handler::shared_pointer handler;
126 if(!
owner->channels.empty() && !
owner->notifiedConn) {
127 handler =
owner->handler;
128 owner->notifiedConn =
true;
130 owner->getfields.push_back(requester);
133 if(desc || !sts.
isOK()) {
134 requester->getDone(sts, desc);
137 handler->onFirstConnect(
owner);
142 pva::ChannelPutRequester::shared_pointer
const &
requester,
143 pvd::PVStructure::shared_pointer
const & pvRequest)
145 std::tr1::shared_ptr<SharedPut> ret(
new SharedPut(shared_from_this(), requester, pvRequest));
150 SharedPV::Handler::shared_pointer handler;
159 owner->puts.push_back(ret.get());
161 ret->mapper.compute(*
owner->current, *pvRequest,
owner->config.mapperMode);
162 type = ret->mapper.requested();
163 warning = ret->mapper.warnings();
166 if(!
owner->channels.empty() && !
owner->notifiedConn) {
167 handler =
owner->handler;
168 owner->notifiedConn =
true;
174 if(type || !sts.
isOK())
175 requester->channelPutConnect(sts, ret, type);
176 }
catch(std::runtime_error& e){
182 handler->onFirstConnect(
owner);
188 pva::ChannelRPCRequester::shared_pointer
const &
requester,
189 pvd::PVStructure::shared_pointer
const & pvRequest)
191 std::tr1::shared_ptr<SharedRPC> ret(
new SharedRPC(shared_from_this(), requester, pvRequest));
192 ret->connected =
true;
201 owner->rpcs.push_back(ret.get());
204 requester->channelRPCConnect(sts, ret);
209 pva::MonitorRequester::shared_pointer
const &
requester,
210 pvd::PVStructure::shared_pointer
const & pvRequest)
213 SharedPV::Handler::shared_pointer handler;
217 std::tr1::shared_ptr<SharedMonitorFIFO> ret(
new SharedMonitorFIFO(shared_from_this(), requester, pvRequest, &mconf));
228 owner->monitors.push_back(ret.get());
229 notify = !!
owner->type;
231 ret->open(
owner->type);
236 if(!
owner->channels.empty() && !
owner->notifiedConn) {
237 handler =
owner->handler;
238 owner->notifiedConn =
true;
251 handler->onFirstConnect(
owner);
259 const requester_type::shared_pointer&
requester,
260 const pvd::PVStructure::const_shared_pointer &pvRequest,
262 :
pva::MonitorFIFO(requester, pvRequest,
pva::MonitorFIFO::
Source::shared_pointer(), conf)
269 channel->owner->monitors.remove(
this);
280 return *impl->pvRequest;
290 return impl->changed;
296 std::tr1::shared_ptr<epics::pvAccess::Channel> chan(impl->getChannel());
298 ret = chan->getChannelName();
305 return impl->info ? impl->info.get() : 0;
315 impl->complete(sts, 0);
326 pva::ChannelBaseRequester::shared_pointer req(impl->getRequester());
333 pva::ChannelBaseRequester::shared_pointer req(impl->getRequester());
340 Guard G(impl->mutex);
341 return impl->debugLvl;
346 return impl->getChannel();
351 return impl->getRequester();
virtual void destroy() OVERRIDE FINAL
std::tr1::shared_ptr< epics::pvAccess::ChannelBaseRequester > getRequester()
virtual std::tr1::shared_ptr< pva::ChannelRequester > getChannelRequester() OVERRIDE FINAL
const requester_type::weak_pointer requester
Information provded by a client to a server-type ChannelProvider.
static Status error(const std::string &m)
std::tr1::shared_ptr< epics::pvAccess::Channel > getChannel()
pvd::StructureConstPtr type
virtual pva::ChannelRPC::shared_pointer createChannelRPC(pva::ChannelRPCRequester::shared_pointer const &requester, pvd::PVStructure::shared_pointer const &pvRequest) OVERRIDE FINAL
void warn(const std::string &)
Send warning message to client. Does not complete().
std::tr1::shared_ptr< const Structure > StructureConstPtr
Mark external symbols and entry points for shared libraries.
epics::pvData::PVRequestMapper::mode_t mapperMode
default Mask.
const std::tr1::shared_ptr< SharedPV > owner
virtual pva::ChannelPut::shared_pointer createChannelPut(pva::ChannelPutRequester::shared_pointer const &requester, pvd::PVStructure::shared_pointer const &pvRequest) OVERRIDE FINAL
SharedMonitorFIFO(const std::tr1::shared_ptr< SharedChannel > &channel, const requester_type::shared_pointer &requester, const pvd::PVStructure::const_shared_pointer &pvRequest, Config *conf)
APIs for the epicsMutex mutual exclusion semaphore.
const epics::pvData::PVStructure & pvRequest() const
pvRequest blob, may be used to modify handling.
virtual void getField(pva::GetFieldRequester::shared_pointer const &requester, std::string const &subField) OVERRIDE FINAL
static size_t num_instances
const ChannelProcessRequester::weak_pointer requester
virtual std::tr1::shared_ptr< pva::ChannelProvider > getProvider() OVERRIDE FINAL
Operation()
create empty op for later assignment
virtual void complete(const pvd::Status &sts, const epics::pvData::PVStructure *value)=0
const epics::pvAccess::PeerInfo * peer() const
const pva::ChannelProvider::weak_pointer provider
Data interface for a structure,.
std::tr1::shared_ptr< const Field > FieldConstPtr
int errlogPrintf(const char *pFormat,...)
virtual std::string getChannelName() OVERRIDE FINAL
virtual ~SharedMonitorFIFO()
virtual std::string getRemoteAddress() OVERRIDE FINAL
std::string channelName() const
The name of the channel through which this request was made (eg. for logging purposes).
const std::string channelName
const epics::pvData::BitSet & changed() const
Applies to value(). Which fields of input data are actual valid. Others should not be used...
void info(const std::string &)
Send info message to client. Does not complete().
SharedChannel(const std::tr1::shared_ptr< SharedPV > &owner, const pva::ChannelProvider::shared_pointer provider, const std::string &channelName, const requester_type::shared_pointer &requester)
const std::tr1::shared_ptr< SharedChannel > channel
bool dropEmptyUpdates
default true. Drop updates which don't include an field values.
std::tr1::shared_ptr< Monitor > MonitorPtr
virtual pva::Monitor::shared_pointer createMonitor(pva::MonitorRequester::shared_pointer const &requester, pvd::PVStructure::shared_pointer const &pvRequest) OVERRIDE FINAL
const epics::pvData::PVStructure & value() const