From 59b45653d1bdade4375333809a3231e907f5afc1 Mon Sep 17 00:00:00 2001 From: miha_vitorovic Date: Fri, 7 Jan 2011 08:44:43 +0100 Subject: [PATCH] blockingClientTCPTransport.cpp: - changed magic numbers to enums blockingTCPTransport.cpp: - debug helpers only responseHandlers.*: - added two new handlers, NOOP and Echo --- .../remote/blockingClientTCPTransport.cpp | 4 +- pvAccessApp/remote/blockingTCPTransport.cpp | 16 +++++++ pvAccessApp/server/responseHandlers.cpp | 43 ++++++++++++++++++- pvAccessApp/server/responseHandlers.h | 35 +++++++++++++++ 4 files changed, 94 insertions(+), 4 deletions(-) diff --git a/pvAccessApp/remote/blockingClientTCPTransport.cpp b/pvAccessApp/remote/blockingClientTCPTransport.cpp index 75f15d4..27fe8b6 100644 --- a/pvAccessApp/remote/blockingClientTCPTransport.cpp +++ b/pvAccessApp/remote/blockingClientTCPTransport.cpp @@ -188,7 +188,7 @@ namespace epics { * send verification response message */ - control->startMessage(1, 2*sizeof(int32)+sizeof(int16)); + control->startMessage(CMD_CONNECTION_VALIDATION, 2*sizeof(int32)+sizeof(int16)); // receive buffer size buffer->putInt(getReceiveBufferSize()); @@ -205,7 +205,7 @@ namespace epics { _verifyOrEcho = false; } else { - control->startMessage(2, 0); + control->startMessage(CMD_ECHO, 0); // send immediately control->flush(true); } diff --git a/pvAccessApp/remote/blockingTCPTransport.cpp b/pvAccessApp/remote/blockingTCPTransport.cpp index 836a055..f5ecb3f 100644 --- a/pvAccessApp/remote/blockingTCPTransport.cpp +++ b/pvAccessApp/remote/blockingTCPTransport.cpp @@ -417,6 +417,11 @@ namespace epics { void BlockingTCPTransport::processReadCached(bool nestedCall, ReceiveStage inStage, int requiredBytes, bool addToBuffer) { + // TODO remove debug + errlogSevPrintf(errlogInfo, + "processReadCached(%d, %d, %d, %d), _stage: %d", + nestedCall, inStage, requiredBytes, addToBuffer, _stage); + try { while(!_closed) { if(_stage==READ_FROM_SOCKET||inStage!=NONE) { @@ -453,6 +458,11 @@ namespace epics { int requiredPosition = (currentStartPosition +requiredBytes); + + // TODO remove debug + errlogSevPrintf(errlogInfo, + "requredPos:%d, buffer->pos:%d", + requiredPosition, _socketBuffer->getPosition()); while(_socketBuffer->getPosition()put(readBuffer, 0, bytesRead); + // TODO remove debug + if(bytesRead>0) errlogSevPrintf( + errlogInfo, + "***!!! got %d bytes of %d (reqPos=%d)!!!***", + bytesRead, requiredBytes, requiredPosition); + if(bytesRead<0) { // error (disconnect, end-of-stream) detected close(true); diff --git a/pvAccessApp/server/responseHandlers.cpp b/pvAccessApp/server/responseHandlers.cpp index f69c5c7..f0e99d0 100644 --- a/pvAccessApp/server/responseHandlers.cpp +++ b/pvAccessApp/server/responseHandlers.cpp @@ -63,9 +63,9 @@ namespace epics { _handlerTable = new ResponseHandler*[HANDLER_TABLE_LENGTH]; // TODO add real handlers, as they are developed - _handlerTable[0] = badResponse; + _handlerTable[0] = new NoopResponse(_context, "Beacon"); _handlerTable[1] = new ConnectionValidationHandler(_context); - _handlerTable[2] = badResponse; + _handlerTable[2] = new EchoHandler(_context); _handlerTable[3] = badResponse; _handlerTable[4] = badResponse; _handlerTable[5] = badResponse; @@ -96,6 +96,8 @@ namespace epics { ServerResponseHandler::~ServerResponseHandler() { delete _handlerTable[0]; delete _handlerTable[1]; + delete _handlerTable[2]; + delete _handlerTable[27]; delete[] _handlerTable; } @@ -137,5 +139,42 @@ namespace epics { //transport.setPriority(payloadBuffer.getShort()); } + class EchoTransportSender : public TransportSender { + public: + EchoTransportSender(osiSockAddr* echoFrom) { + memcpy(&_echoFrom, echoFrom, sizeof(osiSockAddr)); + } + + virtual void send(ByteBuffer* buffer, TransportSendControl* control) { + control->startMessage(CMD_ECHO, 0); + control->setRecipient(&_echoFrom); + } + + virtual void lock() { + } + + virtual void unlock() { + delete this; + } + private: + osiSockAddr _echoFrom; + + virtual ~EchoTransportSender() { + } + }; + + void EchoHandler::handleResponse(osiSockAddr* responseFrom, + Transport* transport, int8 version, int8 command, + int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) { + AbstractServerResponseHandler::handleResponse(responseFrom, + transport, version, command, payloadSize, payloadBuffer); + + EchoTransportSender* echoReply = new EchoTransportSender( + responseFrom); + + // send back + transport->enqueueSendRequest(echoReply); + } + } } diff --git a/pvAccessApp/server/responseHandlers.h b/pvAccessApp/server/responseHandlers.h index f08c399..afbcdba 100644 --- a/pvAccessApp/server/responseHandlers.h +++ b/pvAccessApp/server/responseHandlers.h @@ -103,6 +103,41 @@ namespace epics { int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); }; + /** + * NOOP response. + * @author Matej Sekoranja + * @version $Id: NoopResponse.java,v 1.1 2010/05/03 14:45:39 mrkraimer Exp $ + */ + class NoopResponse : public AbstractServerResponseHandler { + public: + /** + * @param context + * @param description + */ + NoopResponse(ServerContextImpl* context, String description) : + AbstractServerResponseHandler(context, description) { + } + }; + + /** + * Echo request handler. + * @author Matej Sekoranja + * @version $Id: EchoHandler.java,v 1.1 2010/05/03 14:45:39 mrkraimer Exp $ + */ + class EchoHandler : public AbstractServerResponseHandler { + public: + /** + * @param context + */ + EchoHandler(ServerContextImpl* context) : + AbstractServerResponseHandler(context, "Echo request") { + } + + virtual void handleResponse(osiSockAddr* responseFrom, + Transport* transport, int8 version, int8 command, + int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + }; + } }