blockingClientTCPTransport.cpp:

- changed magic numbers to enums

blockingTCPTransport.cpp:
- debug helpers only

responseHandlers.*:
- added two new handlers, NOOP and Echo
This commit is contained in:
miha_vitorovic
2011-01-07 08:44:43 +01:00
parent 25d6336efa
commit 59b45653d1
4 changed files with 94 additions and 4 deletions

View File

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

View File

@@ -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()<requiredPosition) {
// read
char readBuffer[MAX_TCP_RECV];
@@ -462,6 +472,12 @@ namespace epics {
maxToRead, 0);
_socketBuffer->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);

View File

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

View File

@@ -103,6 +103,41 @@ namespace epics {
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
};
/**
* NOOP response.
* @author <a href="mailto:matej.sekoranjaATcosylab.com">Matej Sekoranja</a>
* @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 <a href="mailto:matej.sekoranjaATcosylab.com">Matej Sekoranja</a>
* @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);
};
}
}