5 #ifndef PVATESTCLIENT_H 6 #define PVATESTCLIENT_H 12 #include <epicsMutex.h> 14 #include <pv/pvData.h> 15 #include <pv/bitSet.h> 19 namespace epics {
namespace pvAccess {
20 class ChannelProvider;
55 virtual std::string name()
const =0;
56 virtual void cancel() =0;
57 virtual void show(std::ostream&)
const =0;
61 Operation(
const std::tr1::shared_ptr<Impl>&);
64 std::string name()
const;
69 bool valid()
const {
return !!impl; }
71 #if __cplusplus
>=201103L
72 explicit operator
bool()
const {
return valid(); }
75 typedef bool (Operation::*bool_type)()
const;
77 operator bool_type()
const {
return valid() ? &Operation::valid : 0; }
80 void reset() { impl.reset(); }
83 friend epicsShareFunc ::std::ostream& operator<<(::std::ostream& strm,
const Operation& op);
84 std::tr1::shared_ptr<Impl> impl;
99 struct epicsShareClass
GetEvent :
public PutEvent
102 epics::pvData::PVStructure::const_shared_pointer value;
105 epics::pvData::BitSet::const_shared_pointer valid;
108 struct epicsShareClass InfoEvent :
public PutEvent
111 epics::pvData::FieldConstPtr type;
121 Monitor(
const std::tr1::shared_ptr<Impl>&);
125 std::string name()
const;
144 bool complete()
const;
160 epics::pvData::PVStructure::const_shared_pointer root;
161 epics::pvData::BitSet changed,
164 bool valid()
const {
return !!impl; }
166 #if __cplusplus
>=201103L
167 explicit operator
bool()
const {
return valid(); }
170 typedef bool (Monitor::*bool_type)()
const;
172 operator bool_type()
const {
return valid() ? &Monitor::valid : 0; }
175 void reset() { impl.reset(); }
178 std::tr1::shared_ptr<Impl> impl;
179 friend epicsShareFunc ::std::ostream& operator<<(::std::ostream& strm,
const Monitor& op);
180 friend struct MonitorSync;
210 MonitorSync(
const Monitor&,
const std::tr1::shared_ptr<SImpl>&);
219 bool wait(
double timeout);
233 std::tr1::shared_ptr<SImpl> simpl;
254 void registerRefTrack();
268 #if defined(__GNUC__
) && (__GNUC__
* 100
+ __GNUC_MINOR__
< 305
) 274 std::tr1::shared_ptr<Impl> impl;
275 friend class ClientProvider;
276 friend void detail::registerRefTrack();
277 friend epicsShareFunc ::std::ostream& operator<<(::std::ostream& strm,
const ClientChannel& op);
279 ClientChannel(
const std::tr1::shared_ptr<Impl>& i) :impl(i) {}
282 struct epicsShareClass Options {
286 bool operator<(
const Options&)
const;
297 ClientChannel(
const std::tr1::shared_ptr<epics::pvAccess::ChannelProvider>& provider,
298 const std::string& name,
299 const Options& opt = Options());
303 std::string name()
const;
305 bool valid()
const {
return !!impl; }
307 #if __cplusplus
>=201103L
308 explicit operator
bool()
const {
return valid(); }
311 typedef bool (ClientChannel::*bool_type)()
const;
313 operator bool_type()
const {
return valid() ? &ClientChannel::valid : 0; }
316 void reset() { impl.reset(); }
320 virtual ~GetCallback() {}
322 virtual void getDone(
const GetEvent& evt)=0;
328 Operation get(GetCallback* cb,
329 epics::pvData::PVStructure::const_shared_pointer pvRequest = epics::pvData::PVStructure::const_shared_pointer());
335 epics::pvData::PVStructure::const_shared_pointer
336 get(
double timeout = 3.0,
337 epics::pvData::PVStructure::const_shared_pointer pvRequest = epics::pvData::PVStructure::const_shared_pointer());
344 Operation rpc(GetCallback* cb,
345 const epics::pvData::PVStructure::const_shared_pointer& arguments,
346 epics::pvData::PVStructure::const_shared_pointer pvRequest = epics::pvData::PVStructure::const_shared_pointer());
352 epics::pvData::PVStructure::const_shared_pointer
354 const epics::pvData::PVStructure::const_shared_pointer& arguments,
355 epics::pvData::PVStructure::const_shared_pointer pvRequest = epics::pvData::PVStructure::const_shared_pointer());
359 virtual ~PutCallback() {}
361 Args(epics::pvData::BitSet& tosend, epics::pvData::BitSet& previousmask) :tosend(tosend), previousmask(previousmask) {}
363 epics::pvData::PVStructure::const_shared_pointer root;
365 epics::pvData::BitSet& tosend;
371 epics::pvData::PVStructure::const_shared_pointer previous;
374 const epics::pvData::BitSet& previousmask;
383 virtual void putBuild(
const epics::pvData::StructureConstPtr& build, Args& args) =0;
385 virtual void putDone(
const PutEvent& evt)=0;
394 Operation put(PutCallback* cb,
395 epics::pvData::PVStructure::const_shared_pointer pvRequest = epics::pvData::PVStructure::const_shared_pointer(),
396 bool getprevious =
false);
400 detail::PutBuilder put(
const epics::pvData::PVStructure::const_shared_pointer &pvRequest = epics::pvData::PVStructure::const_shared_pointer());
403 struct MonitorCallback {
404 virtual ~MonitorCallback() {}
412 virtual void monitorEvent(
const MonitorEvent& evt)=0;
417 Monitor monitor(MonitorCallback *cb,
418 epics::pvData::PVStructure::const_shared_pointer pvRequest = epics::pvData::PVStructure::const_shared_pointer());
430 MonitorSync monitor(
const epics::pvData::PVStructure::const_shared_pointer& pvRequest = epics::pvData::PVStructure::const_shared_pointer(),
431 epicsEvent *event =0);
433 struct InfoCallback {
434 virtual ~InfoCallback() {}
436 virtual void infoDone(
const InfoEvent& evt) =0;
441 Operation info(InfoCallback *cb,
const std::string& subfld = std::string());
444 epics::pvData::FieldConstPtr info(
double timeout = 3.0,
445 const std::string& subfld = std::string());
448 struct ConnectCallback {
449 virtual ~ConnectCallback() {}
450 virtual void connectEvent(
const ConnectEvent& evt)=0;
454 void addConnectListener(ConnectCallback*);
456 void removeConnectListener(ConnectCallback*);
458 void show(std::ostream& strm)
const;
460 std::tr1::shared_ptr<epics::pvAccess::Channel> getChannel();
468 ClientChannel& channel;
469 epics::pvData::PVStructure::const_shared_pointer request;
476 triple(
const std::string& name,
const V& value,
bool required =
true)
477 :name(name), required(required), value(value)
481 typedef std::list<triple<epics::pvData::AnyScalar> > scalars_t;
484 typedef std::list<triple<epics::pvData::shared_vector<
const void> > > arrays_t;
489 friend class pvac::ClientChannel;
490 PutBuilder(ClientChannel& channel,
const epics::pvData::PVStructure::const_shared_pointer& request)
491 :channel(channel), request(request)
494 PutBuilder& set(
const std::string& name,
const epics::pvData::AnyScalar& value,
bool required=
true) {
495 scalars.push_back(scalars_t::value_type(name, value, required));
499 PutBuilder& set(
const std::string& name, T value,
bool required=
true) {
500 return set(name, epics::pvData::AnyScalar(value), required);
502 PutBuilder& set(
const std::string& name,
const epics::pvData::shared_vector<
const void>& value,
bool required=
true) {
503 arrays.push_back(arrays_t::value_type(name, value, required));
507 PutBuilder& set(
const std::string& name,
const epics::pvData::shared_vector<
const T>& value,
bool required=
true) {
508 return set(name, epics::pvData::static_shared_vector_cast<
const void>(value), required);
510 void exec(
double timeout=3.0);
520 std::tr1::shared_ptr<Impl> impl;
521 friend void detail::registerRefTrack();
522 friend epicsShareFunc ::std::ostream& operator<<(::std::ostream& strm,
const ClientProvider& op);
534 ClientProvider(
const std::string& providerName,
535 const std::tr1::shared_ptr<epics::pvAccess::Configuration>& conf = std::tr1::shared_ptr<epics::pvAccess::Configuration>());
536 explicit ClientProvider(
const std::tr1::shared_ptr<epics::pvAccess::ChannelProvider>& provider);
539 std::string name()
const;
547 ClientChannel connect(
const std::string& name,
548 const ClientChannel::Options& conf = ClientChannel::Options());
551 bool disconnect(
const std::string& name,
552 const ClientChannel::Options& conf = ClientChannel::Options());
557 bool valid()
const {
return !!impl; }
559 #if __cplusplus
>=201103L
560 explicit operator
bool()
const {
return valid(); }
563 typedef bool (ClientProvider::*bool_type)()
const;
565 operator bool_type()
const {
return valid() ? &ClientProvider::valid : 0; }
568 void reset() { impl.reset(); }
574 ClientChannel::put(
const epics::pvData::PVStructure::const_shared_pointer& pvRequest)
576 return detail::PutBuilder(*
this, pvRequest);
579 epicsShareFunc ::std::ostream& operator<<(::std::ostream& strm,
const Operation& op);
580 epicsShareFunc ::std::ostream& operator<<(::std::ostream& strm,
const Monitor& op);
581 epicsShareFunc ::std::ostream& operator<<(::std::ostream& strm,
const ClientChannel& op);
582 epicsShareFunc ::std::ostream& operator<<(::std::ostream& strm,
const ClientProvider& op);
Represents a single channel.
std::string message
set for event=Fail
Helper to accumulate values to for a Put operation.
Information on get/rpc completion.
Data queue not empty. Call Monitor::poll()
Information on put completion.
Information on monitor subscription/queue change.
std::string peerName
For connection events.
subscription ends in cancellation
virtual void authNZMessage(epics::pvData::PVStructure::shared_pointer const &data)=0
Pass data to the active security plug-in session.
Subscription usable w/o callbacks.
subscription interrupted due to loss of communication
subscription ends in an error
information on connect/disconnect
Handle for monitor subscription.
Thrown by blocking methods of ClientChannel on operation timeout.
bool connected
Is this a connection, or disconnection, event.
Handle for in-progress get/put/rpc operation.