create channel w/ minor error on verification send-back

This commit is contained in:
Matej Sekoranja
2011-01-10 21:15:17 +01:00
parent 349a8217f7
commit 21951b885d
10 changed files with 120 additions and 42 deletions

View File

@@ -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, <code>null</code> if unknown.
* @param[in] responseFrom remote address of the responder, <code>0</code> if unknown.
* @param[in] transport response source transport.
* @param[in] version message version.
* @param[in] payloadSize size of this message data available in the <code>payloadBuffer</code>.
@@ -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() {

View File

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

View File

@@ -39,8 +39,7 @@ namespace epics {
}
ServerResponseHandler::ServerResponseHandler(ServerContextImpl* context) :
ResponseHandler(context) {
ServerResponseHandler::ServerResponseHandler(ServerContextImpl* context) {
BadResponse* badResponse = new BadResponse(context);

View File

@@ -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() {

View File

@@ -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,

View File

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

View File

@@ -50,7 +50,7 @@ private:
class DummyResponseHandler : public ResponseHandler {
public:
DummyResponseHandler(Context* ctx) : ResponseHandler(ctx) {
DummyResponseHandler(Context* ctx) : ResponseHandler() {
}
virtual void handleResponse(osiSockAddr* responseFrom,

View File

@@ -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,

View File

@@ -55,8 +55,8 @@ private:
class DummyResponseHandler : public ResponseHandler {
public:
DummyResponseHandler(Context* context) :
ResponseHandler(context), packets(0) {
DummyResponseHandler(Context* context)
: packets(0) {
}
int getPackets() {

View File

@@ -391,13 +391,33 @@ typedef std::map<pvAccessID, ResponseRequest*> IOIDResponseRequestMap;
class DebugResponse : public ResponseHandler, private epics::pvData::NoDefaultMethods {
/**
* @author <a href="mailto:matej.sekoranjaATcosylab.com">Matej Sekoranja</a>
* @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<pvAccessID, ResponseRequest*> IOIDResponseRequestMap;
ostringstream prologue;
prologue<<"Message [0x"<<hex<<(int)command<<", v0x"<<hex;
prologue<<(int)version<<"] received from "<< ipAddrStr;
std::cout << "ole / " << prologue.str() << std::endl;
hexDump(prologue.str(), "received",
(const int8*)payloadBuffer->getArray(),
@@ -423,11 +442,10 @@ typedef std::map<pvAccessID, ResponseRequest*> 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<pvAccessID, ResponseRequest*> 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<pvAccessID, ResponseRequest*> 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<pvAccessID, ResponseRequest*> 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<ChannelImpl*>(_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 <a href="mailto:matej.sekoranjaATcosylab.com">Matej Sekoranja</a>
@@ -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 {
* <code>sid</code> 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);