compose ServerResponseHandler

This commit is contained in:
Michael Davidsaver
2017-11-06 14:47:10 -06:00
parent 1d7f15de25
commit 5f78671b36
2 changed files with 84 additions and 45 deletions

View File

@@ -13,6 +13,7 @@
#include <pv/remote.h>
#include <pv/serverChannelImpl.h>
#include <pv/baseChannelRequester.h>
#include <pv/securityImpl.h>
namespace epics {
namespace pvAccess {
@@ -48,27 +49,6 @@ public:
std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
};
/**
* PVAS request handler - main handler which dispatches requests to appropriate handlers.
*/
class ServerResponseHandler : public ResponseHandler {
public:
ServerResponseHandler(ServerContextImpl::shared_pointer const & context);
virtual ~ServerResponseHandler() {
}
virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
private:
/**
* Table of response handlers for each command ID.
*/
std::vector<ResponseHandler::shared_pointer> m_handlerTable;
};
/**
* Connection validation message handler.
*/
@@ -785,6 +765,48 @@ private:
epics::pvData::PVStructure::shared_pointer _pvResponse;
epics::pvData::Status _status;
};
/**
* PVAS request handler - main handler which dispatches requests to appropriate handlers.
*/
class ServerResponseHandler : public ResponseHandler {
public:
ServerResponseHandler(ServerContextImpl::shared_pointer const & context);
virtual ~ServerResponseHandler() {
}
virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
private:
ServerBadResponse handle_bad;
ServerNoopResponse handle_beacon;
ServerConnectionValidationHandler handle_validation;
ServerEchoHandler handle_echo;
ServerSearchHandler handle_search;
AuthNZHandler handle_authnz;
ServerCreateChannelHandler handle_create;
ServerDestroyChannelHandler handle_destroy;
ServerGetHandler handle_get;
ServerPutHandler handle_put;
ServerPutGetHandler handle_putget;
ServerMonitorHandler handle_monitor;
ServerArrayHandler handle_array;
ServerDestroyRequestHandler handle_close;
ServerProcessHandler handle_process;
ServerGetFieldHandler handle_getfield;
ServerRPCHandler handle_rpc;
ServerCancelRequestHandler handle_cancel;
/**
* Table of response handlers for each command ID.
*/
std::vector<ResponseHandler*> m_handlerTable;
};
}
}

View File

@@ -104,34 +104,51 @@ void ServerBadResponse::handleResponse(osiSockAddr* responseFrom,
ServerResponseHandler::ServerResponseHandler(ServerContextImpl::shared_pointer const & context)
:ResponseHandler(context.get(), "ServerResponseHandler")
,handle_bad(context)
,handle_beacon(context, "Beacon")
,handle_validation(context)
,handle_echo(context)
,handle_search(context)
,handle_authnz(context.get())
,handle_create(context)
,handle_destroy(context)
,handle_get(context)
,handle_put(context)
,handle_putget(context)
,handle_monitor(context)
,handle_array(context)
,handle_close(context)
,handle_process(context)
,handle_getfield(context)
,handle_rpc(context)
,handle_cancel(context)
,m_handlerTable(CMD_CANCEL_REQUEST+1, &handle_bad)
{
ResponseHandler::shared_pointer badResponse(new ServerBadResponse(context));
m_handlerTable.resize(CMD_CANCEL_REQUEST+1);
m_handlerTable[CMD_BEACON].reset(new ServerNoopResponse(context, "Beacon")); /* 0 */
m_handlerTable[CMD_CONNECTION_VALIDATION].reset(new ServerConnectionValidationHandler(context)); /* 1 */
m_handlerTable[CMD_ECHO].reset(new ServerEchoHandler(context)); /* 2 */
m_handlerTable[CMD_SEARCH].reset(new ServerSearchHandler(context)); /* 3 */
m_handlerTable[CMD_SEARCH_RESPONSE] = badResponse;
m_handlerTable[CMD_AUTHNZ].reset(new AuthNZHandler(context.get())); /* 5 */
m_handlerTable[CMD_ACL_CHANGE] = badResponse; /* 6 - access right change */
m_handlerTable[CMD_CREATE_CHANNEL].reset(new ServerCreateChannelHandler(context)); /* 7 */
m_handlerTable[CMD_DESTROY_CHANNEL].reset(new ServerDestroyChannelHandler(context)); /* 8 */
m_handlerTable[CMD_CONNECTION_VALIDATED] = badResponse; /* 9 */
m_handlerTable[CMD_BEACON] = &handle_beacon; /* 0 */
m_handlerTable[CMD_CONNECTION_VALIDATION] = &handle_validation; /* 1 */
m_handlerTable[CMD_ECHO] = &handle_echo; /* 2 */
m_handlerTable[CMD_SEARCH] = &handle_search; /* 3 */
m_handlerTable[CMD_SEARCH_RESPONSE] = &handle_bad;
m_handlerTable[CMD_AUTHNZ] = &handle_authnz; /* 5 */
m_handlerTable[CMD_ACL_CHANGE] = &handle_bad; /* 6 - access right change */
m_handlerTable[CMD_CREATE_CHANNEL] = &handle_create; /* 7 */
m_handlerTable[CMD_DESTROY_CHANNEL] = &handle_destroy; /* 8 */
m_handlerTable[CMD_CONNECTION_VALIDATED] = &handle_bad; /* 9 */
m_handlerTable[CMD_GET].reset(new ServerGetHandler(context)); /* 10 - get response */
m_handlerTable[CMD_PUT].reset(new ServerPutHandler(context)); /* 11 - put response */
m_handlerTable[CMD_PUT_GET].reset(new ServerPutGetHandler(context)); /* 12 - put-get response */
m_handlerTable[CMD_MONITOR].reset(new ServerMonitorHandler(context)); /* 13 - monitor response */
m_handlerTable[CMD_ARRAY].reset(new ServerArrayHandler(context)); /* 14 - array response */
m_handlerTable[CMD_DESTROY_REQUEST].reset(new ServerDestroyRequestHandler(context)); /* 15 - destroy request */
m_handlerTable[CMD_PROCESS].reset(new ServerProcessHandler(context)); /* 16 - process response */
m_handlerTable[CMD_GET_FIELD].reset(new ServerGetFieldHandler(context)); /* 17 - get field response */
m_handlerTable[CMD_MESSAGE] = badResponse; /* 18 - message to Requester */
m_handlerTable[CMD_MULTIPLE_DATA] = badResponse; /* 19 - grouped monitors */
m_handlerTable[CMD_GET] = &handle_get; /* 10 - get response */
m_handlerTable[CMD_PUT] = &handle_put; /* 11 - put response */
m_handlerTable[CMD_PUT_GET] = &handle_putget; /* 12 - put-get response */
m_handlerTable[CMD_MONITOR] = &handle_monitor; /* 13 - monitor response */
m_handlerTable[CMD_ARRAY] = &handle_array; /* 14 - array response */
m_handlerTable[CMD_DESTROY_REQUEST] = &handle_close; /* 15 - destroy request */
m_handlerTable[CMD_PROCESS] = &handle_process; /* 16 - process response */
m_handlerTable[CMD_GET_FIELD] = &handle_getfield; /* 17 - get field response */
m_handlerTable[CMD_MESSAGE] = &handle_bad; /* 18 - message to Requester */
m_handlerTable[CMD_MULTIPLE_DATA] = &handle_bad; /* 19 - grouped monitors */
m_handlerTable[CMD_RPC].reset(new ServerRPCHandler(context)); /* 20 - RPC response */
m_handlerTable[CMD_CANCEL_REQUEST].reset(new ServerCancelRequestHandler(context)); /* 21 - cancel request */
m_handlerTable[CMD_RPC] = &handle_rpc; /* 20 - RPC response */
m_handlerTable[CMD_CANCEL_REQUEST] = &handle_cancel; /* 21 - cancel request */
}
void ServerResponseHandler::handleResponse(osiSockAddr* responseFrom,