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);