diff --git a/pvAccessApp/remote/remote.h b/pvAccessApp/remote/remote.h index 8a8aaea..496c818 100644 --- a/pvAccessApp/remote/remote.h +++ b/pvAccessApp/remote/remote.h @@ -289,16 +289,9 @@ namespace epics { */ class ResponseHandler { public: - ResponseHandler(Context* context) : - _context(context) { - } - - virtual ~ResponseHandler() { - } - /** * Handle response. - * @param[in] responseFrom remote address of the responder, null if unknown. + * @param[in] responseFrom remote address of the responder, 0 if unknown. * @param[in] transport response source transport. * @param[in] version message version. * @param[in] payloadSize size of this message data available in the payloadBuffer. @@ -310,9 +303,6 @@ namespace epics { handleResponse(osiSockAddr* responseFrom, Transport* transport, int8 version, int8 command, int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) =0; - - protected: - Context* _context; }; /** @@ -326,9 +316,8 @@ namespace epics { * @param description */ AbstractResponseHandler(Context* context, String description) : - ResponseHandler(context), _description(description), _debug( - _context->getConfiguration()->getPropertyAsBoolean( - "PVACCESS_DEBUG", false)) { + _description(description), + _debug(context->getConfiguration()->getPropertyAsBoolean("PVACCESS_DEBUG", false)) { } virtual ~AbstractResponseHandler() { diff --git a/pvAccessApp/remoteClient/clientContextImpl.h b/pvAccessApp/remoteClient/clientContextImpl.h index bf5bf1e..378abcf 100644 --- a/pvAccessApp/remoteClient/clientContextImpl.h +++ b/pvAccessApp/remoteClient/clientContextImpl.h @@ -24,6 +24,9 @@ namespace epics { public: virtual pvAccessID getChannelID() = 0; virtual void destroyChannel(bool force) = 0; + virtual void connectionCompleted(pvAccessID sid/*, rights*/) = 0; + virtual void createChannelFailed() = 0; + }; diff --git a/pvAccessApp/server/responseHandlers.cpp b/pvAccessApp/server/responseHandlers.cpp index fe57284..b96c659 100644 --- a/pvAccessApp/server/responseHandlers.cpp +++ b/pvAccessApp/server/responseHandlers.cpp @@ -39,8 +39,7 @@ namespace epics { } - ServerResponseHandler::ServerResponseHandler(ServerContextImpl* context) : - ResponseHandler(context) { + ServerResponseHandler::ServerResponseHandler(ServerContextImpl* context) { BadResponse* badResponse = new BadResponse(context); diff --git a/pvAccessApp/server/responseHandlers.h b/pvAccessApp/server/responseHandlers.h index 7aeab36..ccc3849 100644 --- a/pvAccessApp/server/responseHandlers.h +++ b/pvAccessApp/server/responseHandlers.h @@ -19,14 +19,15 @@ namespace epics { * @version $Id: AbstractServerResponseHandler.java,v 1.1 2010/05/03 14:45:39 mrkraimer Exp $ */ class AbstractServerResponseHandler : public AbstractResponseHandler { + protected: + ServerContextImpl* _context; public: /** * @param context * @param description */ - AbstractServerResponseHandler(ServerContextImpl* context, - String description) : - AbstractResponseHandler(context, description) { + AbstractServerResponseHandler(ServerContextImpl* context, String description) : + AbstractResponseHandler(context, description), _context(context) { } virtual ~AbstractServerResponseHandler() { diff --git a/testApp/remote/testBeaconEmitter.cpp b/testApp/remote/testBeaconEmitter.cpp index c1a3026..9e98d85 100644 --- a/testApp/remote/testBeaconEmitter.cpp +++ b/testApp/remote/testBeaconEmitter.cpp @@ -18,7 +18,7 @@ using namespace epics::pvData; class DummyResponseHandler : public ResponseHandler { public: - DummyResponseHandler(Context* ctx) : ResponseHandler(ctx) {} + DummyResponseHandler(Context* ctx) : ResponseHandler() {} virtual void handleResponse(osiSockAddr* responseFrom, Transport* transport, int8 version, int8 command, int payloadSize, diff --git a/testApp/remote/testBeaconHandler.cpp b/testApp/remote/testBeaconHandler.cpp index 6690ab4..0e5ec28 100644 --- a/testApp/remote/testBeaconHandler.cpp +++ b/testApp/remote/testBeaconHandler.cpp @@ -37,7 +37,7 @@ void decodeFromIPv6Address(ByteBuffer* buffer, osiSockAddr* address) class BeaconResponseHandler : public ResponseHandler { public: - BeaconResponseHandler(Context* ctx) : ResponseHandler(ctx) + BeaconResponseHandler(Context* ctx) : ResponseHandler() { _pvDataCreate = getPVDataCreate(); } diff --git a/testApp/remote/testBlockingTCPClnt.cpp b/testApp/remote/testBlockingTCPClnt.cpp index d845c1b..4340caa 100644 --- a/testApp/remote/testBlockingTCPClnt.cpp +++ b/testApp/remote/testBlockingTCPClnt.cpp @@ -50,7 +50,7 @@ private: class DummyResponseHandler : public ResponseHandler { public: - DummyResponseHandler(Context* ctx) : ResponseHandler(ctx) { + DummyResponseHandler(Context* ctx) : ResponseHandler() { } virtual void handleResponse(osiSockAddr* responseFrom, diff --git a/testApp/remote/testBlockingUDPClnt.cpp b/testApp/remote/testBlockingUDPClnt.cpp index 3e124d9..7fb490c 100644 --- a/testApp/remote/testBlockingUDPClnt.cpp +++ b/testApp/remote/testBlockingUDPClnt.cpp @@ -60,9 +60,8 @@ private: class DummyResponseHandler : public ResponseHandler { public: - DummyResponseHandler(Context* ctx) : - ResponseHandler(ctx) { - } + DummyResponseHandler(Context* ctx) + { } virtual void handleResponse(osiSockAddr* responseFrom, Transport* transport, int8 version, int8 command, int payloadSize, diff --git a/testApp/remote/testBlockingUDPSrv.cpp b/testApp/remote/testBlockingUDPSrv.cpp index 16612ac..5308428 100644 --- a/testApp/remote/testBlockingUDPSrv.cpp +++ b/testApp/remote/testBlockingUDPSrv.cpp @@ -55,8 +55,8 @@ private: class DummyResponseHandler : public ResponseHandler { public: - DummyResponseHandler(Context* context) : - ResponseHandler(context), packets(0) { + DummyResponseHandler(Context* context) + : packets(0) { } int getPackets() { diff --git a/testApp/remote/testRemoteClientImpl.cpp b/testApp/remote/testRemoteClientImpl.cpp index 5f8c362..e9ca92b 100644 --- a/testApp/remote/testRemoteClientImpl.cpp +++ b/testApp/remote/testRemoteClientImpl.cpp @@ -391,13 +391,33 @@ typedef std::map IOIDResponseRequestMap; - class DebugResponse : public ResponseHandler, private epics::pvData::NoDefaultMethods { + /** + * @author Matej Sekoranja + * @version $Id: AbstractServerResponseHandler.java,v 1.1 2010/05/03 14:45:39 mrkraimer Exp $ + */ + class AbstractClientResponseHandler : public AbstractResponseHandler { + protected: + ClientContextImpl* _context; + public: + /** + * @param context + * @param description + */ + AbstractClientResponseHandler(ClientContextImpl* context, String description) : + AbstractResponseHandler(context, description), _context(context) { + } + + virtual ~AbstractClientResponseHandler() { + } + }; + + class DebugResponse : public AbstractClientResponseHandler, private epics::pvData::NoDefaultMethods { public: /** * @param context */ - DebugResponse(Context* ctx) : - ResponseHandler(ctx) + DebugResponse(ClientContextImpl* context) : + AbstractClientResponseHandler(context, "not implemented") { } @@ -414,7 +434,6 @@ typedef std::map IOIDResponseRequestMap; ostringstream prologue; prologue<<"Message [0x"<getArray(), @@ -423,11 +442,10 @@ typedef std::map IOIDResponseRequestMap; } }; - class SearchResponseHandler : public ResponseHandler, private epics::pvData::NoDefaultMethods { - private: - ClientContextImpl* m_context; + class SearchResponseHandler : public AbstractClientResponseHandler, private epics::pvData::NoDefaultMethods { public: - SearchResponseHandler(ClientContextImpl* context) : ResponseHandler(context), m_context(context) + SearchResponseHandler(ClientContextImpl* context) : + AbstractClientResponseHandler(context, "Search response") { } @@ -438,7 +456,7 @@ typedef std::map IOIDResponseRequestMap; Transport* transport, int8 version, int8 command, int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) { - // TODO super.handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); + AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); transport->ensureData(5); int32 searchSequenceId = payloadBuffer->getInt(); @@ -472,7 +490,7 @@ typedef std::map IOIDResponseRequestMap; serverAddress.ia.sin_port = htons(payloadBuffer->getShort()); // reads CIDs - ChannelSearchManager* csm = m_context->getChannelSearchManager(); + ChannelSearchManager* csm = _context->getChannelSearchManager(); int16 count = payloadBuffer->getShort(); for (int i = 0; i < count; i++) { @@ -486,6 +504,75 @@ typedef std::map IOIDResponseRequestMap; }; + class ConnectionValidationHandler : public AbstractClientResponseHandler, private epics::pvData::NoDefaultMethods { + public: + ConnectionValidationHandler(ClientContextImpl* context) : + AbstractClientResponseHandler(context, "Connection validation") + { + } + + virtual ~ConnectionValidationHandler() { + } + + virtual void handleResponse(osiSockAddr* responseFrom, + Transport* transport, int8 version, int8 command, + int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) + { + AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); + + transport->ensureData(8); + transport->setRemoteTransportReceiveBufferSize(payloadBuffer->getInt()); + transport->setRemoteTransportSocketReceiveBufferSize(payloadBuffer->getInt()); + + transport->setRemoteMinorRevision(version); + + transport->enqueueSendRequest((TransportSender*)transport); + transport->verified(); + + } + }; + + class CreateChannelHandler : public AbstractClientResponseHandler, private epics::pvData::NoDefaultMethods { + public: + CreateChannelHandler(ClientContextImpl* context) : + AbstractClientResponseHandler(context, "Create channel") + { + } + + virtual ~CreateChannelHandler() { + } + + virtual void handleResponse(osiSockAddr* responseFrom, + Transport* transport, int8 version, int8 command, + int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) + { + AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); + + transport->ensureData(8); + pvAccessID cid = payloadBuffer->getInt(); + pvAccessID sid = payloadBuffer->getInt(); + // TODO... do not destroy OK + Status* status = transport->getIntrospectionRegistry()->deserializeStatus(payloadBuffer, transport); + + ChannelImpl* channel = static_cast(_context->getChannel(cid)); + if (channel) + { + // failed check + if (!status->isSuccess()) { + channel->createChannelFailed(); + return; + } + + //int16 acl = payloadBuffer->getShort(); + + channel->connectionCompleted(sid); + } + + } + }; + + + /** * CA response handler - main handler which dispatches responses to appripriate handlers. * @author Matej Sekoranja @@ -513,20 +600,20 @@ class ClientResponseHandler : public ResponseHandler, private epics::pvData::NoD /** * @param context */ - ClientResponseHandler(ClientContextImpl* context) : ResponseHandler((Context*)context) { - static ResponseHandler* badResponse = new DebugResponse((Context*)context); + ClientResponseHandler(ClientContextImpl* context) { + static ResponseHandler* badResponse = new DebugResponse(context); static ResponseHandler* dataResponse = 0; //new DataResponseHandler(context); #define HANDLER_COUNT 28 m_handlerTable = new ResponseHandler*[HANDLER_COUNT]; m_handlerTable[ 0] = badResponse; // TODO new BeaconHandler(context), /* 0 */ - m_handlerTable[ 1] = badResponse; // TODO new ConnectionValidationHandler(context), /* 1 */ + m_handlerTable[ 1] = new ConnectionValidationHandler(context), /* 1 */ m_handlerTable[ 2] = badResponse; // TODO new NoopResponse(context, "Echo"), /* 2 */ m_handlerTable[ 3] = badResponse; // TODO new NoopResponse(context, "Search"), /* 3 */ m_handlerTable[ 4] = new SearchResponseHandler(context), /* 4 */ m_handlerTable[ 5] = badResponse; // TODO new NoopResponse(context, "Introspection search"), /* 5 */ m_handlerTable[ 6] = dataResponse; /* 6 - introspection search */ - m_handlerTable[ 7] = badResponse; // TODO new CreateChannelHandler(context), /* 7 */ + m_handlerTable[ 7] = new CreateChannelHandler(context), /* 7 */ m_handlerTable[ 8] = badResponse; // TODO new NoopResponse(context, "Destroy channel"), /* 8 */ // TODO it might be useful to implement this... m_handlerTable[ 9] = badResponse; /* 9 */ m_handlerTable[10] = dataResponse; /* 10 - get response */ @@ -912,7 +999,7 @@ class TestChannelImpl : public ChannelImpl { * sid might not be valid, this depends on protocol revision. * @param sid */ - void connectionCompleted(pvAccessID sid/*, rights*/) + virtual void connectionCompleted(pvAccessID sid/*, rights*/) { Lock guard(&m_channelMutex);