From 15e435ddf668ef470883e54441aa77570ca6bd68 Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Mon, 20 Dec 2010 23:56:29 +0100 Subject: [PATCH] Channel::getField() --- pvAccessApp/client/pvAccess.h | 2 +- testApp/client/MockClientImpl.cpp | 118 +++++++++++++++++++++++++++--- 2 files changed, 108 insertions(+), 12 deletions(-) diff --git a/pvAccessApp/client/pvAccess.h b/pvAccessApp/client/pvAccess.h index 4c5b72c..c85a9da 100644 --- a/pvAccessApp/client/pvAccess.h +++ b/pvAccessApp/client/pvAccess.h @@ -405,7 +405,7 @@ namespace epics { namespace pvAccess { * @param status Completion status. * @param field The Structure for the request. */ - virtual void getDone(epics::pvData::Status *status,epics::pvData::Field *field) = 0; + virtual void getDone(epics::pvData::Status *status,epics::pvData::FieldConstPtr field) = 0; }; diff --git a/testApp/client/MockClientImpl.cpp b/testApp/client/MockClientImpl.cpp index e6e6844..5558625 100644 --- a/testApp/client/MockClientImpl.cpp +++ b/testApp/client/MockClientImpl.cpp @@ -6,14 +6,11 @@ #include #include #include +#include using namespace epics::pvData; using namespace epics::pvAccess; - - - - static volatile int64 mockChannel_totalConstruct = 0; static volatile int64 mockChannel_totalDestruct = 0; static Mutex *mockChannel_globalMutex = 0; @@ -52,9 +49,13 @@ class MockChannel : public Channel { String m_name; String m_remoteAddress; + PVStructure* pvStructure; + private: ~MockChannel() { + delete pvStructure; + Lock xx(mockChannel_globalMutex); mockChannel_totalDestruct++; } @@ -75,6 +76,16 @@ class MockChannel : public Channel { Lock xx(mockChannel_globalMutex); mockChannel_totalConstruct++; + + + ScalarType stype = pvDouble; + String allProperties("alarm,timeStamp,display,control,valueAlarm"); + + pvStructure = getStandardPVField()->scalar( + 0,name,stype,allProperties); + PVDouble *pvField = pvStructure->getDoubleField(String("value")); + pvField->put(1.123e35); + // already connected, report state m_requester->channelStateChange(this, CONNECTED); @@ -132,7 +143,7 @@ class MockChannel : public Channel { virtual void getField(GetFieldRequester *requester,epics::pvData::String subField) { - // TODO + requester->getDone(getStatusCreate()->getStatusOK(),pvStructure->getSubField(subField)->getField()); } virtual ChannelProcess* createChannelProcess( @@ -191,10 +202,45 @@ class MockChannel : public Channel { } }; +class MockChannelProvider; + +class MockChannelFind : public ChannelFind +{ + public: + MockChannelFind(ChannelProvider* provider) : m_provider(provider) + { + } + + virtual void destroy() + { + // one instance for all, do not delete at all + } + + virtual ChannelProvider* getChannelProvider() + { + return m_provider; + }; + + virtual void cancelChannelFind() + { + throw std::runtime_error("not supported"); + } + + private: + + // only to be destroyed by it + friend class MockChannelProvider; + virtual ~MockChannelFind() {} + + ChannelProvider* m_provider; +}; class MockChannelProvider : public ChannelProvider { public: + MockChannelProvider() : m_mockChannelFind(new MockChannelFind(this)) { + } + virtual epics::pvData::String getProviderName() { return "MockChannelProvider"; @@ -202,6 +248,7 @@ class MockChannelProvider : public ChannelProvider { virtual void destroy() { + delete m_mockChannelFind; delete this; } @@ -209,9 +256,8 @@ class MockChannelProvider : public ChannelProvider { epics::pvData::String channelName, ChannelFindRequester *channelFindRequester) { - ChannelFind* channelFind = 0; // TODO - channelFindRequester->channelFindResult(getStatusCreate()->getStatusOK(), channelFind, true); - return channelFind; + channelFindRequester->channelFindResult(getStatusCreate()->getStatusOK(), m_mockChannelFind, true); + return m_mockChannelFind; } virtual Channel* createChannel( @@ -246,6 +292,8 @@ class MockChannelProvider : public ChannelProvider { private: ~MockChannelProvider() {}; + MockChannelFind* m_mockChannelFind; + }; @@ -302,6 +350,17 @@ class MockClientContext : public ClientContext }; +class ChannelFindRequesterImpl : public ChannelFindRequester +{ + virtual void channelFindResult(epics::pvData::Status *status,ChannelFind *channelFind,bool wasFound) + { + std::cout << "[ChannelFindRequesterImpl] channelFindResult("; + String str; + status->toString(&str); + std::cout << str << ", ..., " << wasFound << ")" << std::endl; + } +}; + class ChannelRequesterImpl : public ChannelRequester { virtual String getRequesterName() @@ -328,17 +387,54 @@ class ChannelRequesterImpl : public ChannelRequester } }; +class GetFieldRequesterImpl : public GetFieldRequester +{ + virtual String getRequesterName() + { + return "GetFieldRequesterImpl"; + }; + + virtual void message(String message,MessageType messageType) + { + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + } + + virtual void getDone(epics::pvData::Status *status,epics::pvData::FieldConstPtr field) + { + std::cout << "getDone("; + String str; + status->toString(&str); + std::cout << str << ", "; + if (field) + { + str.clear(); + field->toString(&str); + std::cout << str; + } + else + std::cout << "(null)"; + std::cout << ")" << std::endl; + } +}; + int main(int argc,char *argv[]) { MockClientContext* context = new MockClientContext(); context->printInfo(); - ChannelRequesterImpl requester; - /*Channel* noChannel =*/ context->getProvider()->createChannel("test", &requester, ChannelProvider::PRIORITY_DEFAULT, "over the rainbow"); + ChannelFindRequesterImpl findRequester; + context->getProvider()->channelFind("something", &findRequester); + + ChannelRequesterImpl channelRequester; + /*Channel* noChannel =*/ context->getProvider()->createChannel("test", &channelRequester, ChannelProvider::PRIORITY_DEFAULT, "over the rainbow"); - Channel* channel = context->getProvider()->createChannel("test", &requester); + Channel* channel = context->getProvider()->createChannel("test", &channelRequester); std::cout << channel->getChannelName() << std::endl; + + GetFieldRequesterImpl getFieldRequesterImpl; + channel->getField(&getFieldRequesterImpl, "timeStamp.secondsPastEpoch"); + channel->destroy();