Status changes
This commit is contained in:
@@ -85,25 +85,25 @@ namespace epics { namespace pvAccess {
|
||||
* @param channelArray The channelArray interface or null if the request failed.
|
||||
* @param pvArray The PVArray that holds the data.
|
||||
*/
|
||||
virtual void channelArrayConnect(epics::pvData::Status *status,ChannelArray *channelArray,epics::pvData::PVArray *pvArray) = 0;
|
||||
virtual void channelArrayConnect(const epics::pvData::Status &status,ChannelArray *channelArray,epics::pvData::PVArray *pvArray) = 0;
|
||||
|
||||
/**
|
||||
* The request is done. This is always called with no locks held.
|
||||
* @param status Completion status.
|
||||
*/
|
||||
virtual void putArrayDone(epics::pvData::Status *status) = 0;
|
||||
virtual void putArrayDone(const epics::pvData::Status &status) = 0;
|
||||
|
||||
/**
|
||||
* The request is done. This is always called with no locks held.
|
||||
* @param status Completion status.
|
||||
*/
|
||||
virtual void getArrayDone(epics::pvData::Status *status) = 0;
|
||||
virtual void getArrayDone(const epics::pvData::Status &status) = 0;
|
||||
|
||||
/**
|
||||
* The request is done. This is always called with no locks held.
|
||||
* @param status Completion status.
|
||||
*/
|
||||
virtual void setLengthDone(epics::pvData::Status *status) = 0;
|
||||
virtual void setLengthDone(const epics::pvData::Status &status) = 0;
|
||||
};
|
||||
|
||||
|
||||
@@ -127,7 +127,7 @@ namespace epics { namespace pvAccess {
|
||||
/**
|
||||
* @param status Completion status.
|
||||
*/
|
||||
virtual void channelFindResult(epics::pvData::Status *status,ChannelFind *channelFind,bool wasFound) = 0;
|
||||
virtual void channelFindResult(const epics::pvData::Status &status,ChannelFind *channelFind,bool wasFound) = 0;
|
||||
};
|
||||
|
||||
|
||||
@@ -164,14 +164,14 @@ namespace epics { namespace pvAccess {
|
||||
* @param pvStructure The PVStructure that holds the data.
|
||||
* @param bitSet The bitSet for that shows what data has changed.
|
||||
*/
|
||||
virtual void channelGetConnect(epics::pvData::Status *status,ChannelGet *channelGet,
|
||||
virtual void channelGetConnect(const epics::pvData::Status &status,ChannelGet *channelGet,
|
||||
epics::pvData::PVStructure *pvStructure,epics::pvData::BitSet *bitSet) = 0;
|
||||
|
||||
/**
|
||||
* The request is done. This is always called with no locks held.
|
||||
* @param status Completion status.
|
||||
*/
|
||||
virtual void getDone(epics::pvData::Status *status) = 0;
|
||||
virtual void getDone(const epics::pvData::Status &status) = 0;
|
||||
};
|
||||
|
||||
|
||||
@@ -207,13 +207,13 @@ namespace epics { namespace pvAccess {
|
||||
* @param channelProcess The channelProcess interface or null if the client could not become
|
||||
* the record processor.
|
||||
*/
|
||||
virtual void channelProcessConnect(epics::pvData::Status *status,ChannelProcess *channelProcess) = 0;
|
||||
virtual void channelProcessConnect(const epics::pvData::Status &status,ChannelProcess *channelProcess) = 0;
|
||||
|
||||
/**
|
||||
* The process request is done. This is always called with no locks held.
|
||||
* @param status Completion status.
|
||||
*/
|
||||
virtual void processDone(epics::pvData::Status *status) = 0;
|
||||
virtual void processDone(const epics::pvData::Status &status) = 0;
|
||||
};
|
||||
|
||||
|
||||
@@ -255,20 +255,20 @@ namespace epics { namespace pvAccess {
|
||||
* @param pvStructure The PVStructure that holds the data.
|
||||
* @param bitSet The bitSet for that shows what data has changed.
|
||||
*/
|
||||
virtual void channelPutConnect(epics::pvData::Status *status,ChannelPut *channelPut,
|
||||
virtual void channelPutConnect(const epics::pvData::Status &status,ChannelPut *channelPut,
|
||||
epics::pvData::PVStructure *pvStructure,epics::pvData::BitSet *bitSet) = 0;
|
||||
|
||||
/**
|
||||
* The request is done. This is always called with no locks held.
|
||||
* @param status Completion status.
|
||||
*/
|
||||
virtual void putDone(epics::pvData::Status *status) = 0;
|
||||
virtual void putDone(const epics::pvData::Status &status) = 0;
|
||||
|
||||
/**
|
||||
* The get request is done. This is always called with no locks held.
|
||||
* @param status Completion status.
|
||||
*/
|
||||
virtual void getDone(epics::pvData::Status *status) = 0;
|
||||
virtual void getDone(const epics::pvData::Status &status) = 0;
|
||||
};
|
||||
|
||||
|
||||
@@ -317,25 +317,25 @@ namespace epics { namespace pvAccess {
|
||||
* @param pvPutStructure The PVStructure that holds the putData.
|
||||
* @param pvGetStructure The PVStructure that holds the getData.
|
||||
*/
|
||||
virtual void channelPutGetConnect(epics::pvData::Status *status,ChannelPutGet *channelPutGet,
|
||||
virtual void channelPutGetConnect(const epics::pvData::Status &status,ChannelPutGet *channelPutGet,
|
||||
epics::pvData::PVStructure *pvPutStructure,epics::pvData::PVStructure *pvGetStructure) = 0;
|
||||
/**
|
||||
* The putGet request is done. This is always called with no locks held.
|
||||
* @param status Completion status.
|
||||
*/
|
||||
virtual void putGetDone(epics::pvData::Status *status) = 0;
|
||||
virtual void putGetDone(const epics::pvData::Status &status) = 0;
|
||||
|
||||
/**
|
||||
* The getPut request is done. This is always called with no locks held.
|
||||
* @param status Completion status.
|
||||
*/
|
||||
virtual void getPutDone(epics::pvData::Status *status) = 0;
|
||||
virtual void getPutDone(const epics::pvData::Status &status) = 0;
|
||||
|
||||
/**
|
||||
* The getGet request is done. This is always called with no locks held.
|
||||
* @param status Completion status.
|
||||
*/
|
||||
virtual void getGetDone(epics::pvData::Status *status) = 0;
|
||||
virtual void getGetDone(const epics::pvData::Status &status) = 0;
|
||||
};
|
||||
|
||||
|
||||
@@ -371,7 +371,7 @@ namespace epics { namespace pvAccess {
|
||||
* @param pvArgument The argument structure for an RPC request.
|
||||
* @param bitSet The bitSet for argument changes.
|
||||
*/
|
||||
virtual void channelRPCConnect(epics::pvData::Status *status,ChannelRPC *channelRPC,
|
||||
virtual void channelRPCConnect(const epics::pvData::Status &status,ChannelRPC *channelRPC,
|
||||
epics::pvData::PVStructure *pvArgument,epics::pvData::BitSet *bitSet) = 0;
|
||||
|
||||
/**
|
||||
@@ -379,7 +379,7 @@ namespace epics { namespace pvAccess {
|
||||
* @param status Completion status.
|
||||
* @param pvResponse The response data for the RPC request.
|
||||
*/
|
||||
virtual void requestDone(epics::pvData::Status *status,epics::pvData::PVStructure *pvResponse) = 0;
|
||||
virtual void requestDone(const epics::pvData::Status &status,epics::pvData::PVStructure *pvResponse) = 0;
|
||||
};
|
||||
|
||||
|
||||
@@ -396,7 +396,7 @@ namespace epics { namespace pvAccess {
|
||||
* @param status Completion status.
|
||||
* @param field The Structure for the request.
|
||||
*/
|
||||
virtual void getDone(epics::pvData::Status *status,epics::pvData::FieldConstPtr field) = 0;
|
||||
virtual void getDone(const epics::pvData::Status &status,epics::pvData::FieldConstPtr field) = 0;
|
||||
};
|
||||
|
||||
|
||||
@@ -588,7 +588,7 @@ namespace epics { namespace pvAccess {
|
||||
* @param status Completion status.
|
||||
* @param channel The channel.
|
||||
*/
|
||||
virtual void channelCreated(epics::pvData::Status* status, Channel *channel) = 0;
|
||||
virtual void channelCreated(const epics::pvData::Status &status, Channel *channel) = 0;
|
||||
|
||||
/**
|
||||
* A channel connection state change has occurred.
|
||||
|
||||
@@ -537,7 +537,7 @@ namespace epics {
|
||||
* Report status to clients (e.g. disconnected).
|
||||
* @param status to report.
|
||||
*/
|
||||
virtual void reportStatus(epics::pvData::Status* status) = 0;
|
||||
virtual void reportStatus(const epics::pvData::Status& status) = 0;
|
||||
|
||||
/**
|
||||
* Get request requester.
|
||||
|
||||
@@ -33,8 +33,8 @@ using namespace epics::pvData;
|
||||
namespace epics {
|
||||
namespace pvAccess {
|
||||
|
||||
Status* ChannelImpl::channelDestroyed = getStatusCreate()->createStatus(STATUSTYPE_WARNING, "channel destroyed");
|
||||
Status* ChannelImpl::channelDisconnected = getStatusCreate()->createStatus(STATUSTYPE_WARNING, "channel disconnected");
|
||||
Status ChannelImpl::channelDestroyed = Status(Status::STATUSTYPE_WARNING, "channel destroyed");
|
||||
Status ChannelImpl::channelDisconnected = Status(Status::STATUSTYPE_WARNING, "channel disconnected");
|
||||
|
||||
|
||||
// TODO consider std::unordered_map
|
||||
@@ -86,23 +86,23 @@ namespace epics {
|
||||
|
||||
int m_refCount;
|
||||
|
||||
Status m_status;
|
||||
|
||||
virtual ~BaseRequestImpl() {};
|
||||
|
||||
public:
|
||||
|
||||
static StatusCreate* statusCreate;
|
||||
static PVDataCreate* pvDataCreate;
|
||||
|
||||
static Status* okStatus;
|
||||
static Status* destroyedStatus;
|
||||
static Status* channelNotConnected;
|
||||
static Status* otherRequestPendingStatus;
|
||||
static Status* pvRequestNull;
|
||||
static Status destroyedStatus;
|
||||
static Status channelNotConnected;
|
||||
static Status otherRequestPendingStatus;
|
||||
static Status pvRequestNull;
|
||||
|
||||
BaseRequestImpl(ChannelImpl* channel, Requester* requester) :
|
||||
m_channel(channel), m_context(channel->getContext()),
|
||||
m_requester(requester), m_destroyed(false), m_remotelyDestroy(false),
|
||||
m_pendingRequest(NULL_REQUEST), m_refCount(1)
|
||||
m_pendingRequest(NULL_REQUEST), m_refCount(1), m_status()
|
||||
{
|
||||
// register response request
|
||||
m_ioid = m_context->registerResponseRequest(this);
|
||||
@@ -138,20 +138,20 @@ namespace epics {
|
||||
return m_ioid;
|
||||
}
|
||||
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) = 0;
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) = 0;
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) = 0;
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) = 0;
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) = 0;
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) = 0;
|
||||
|
||||
virtual void response(Transport* transport, int8 version, ByteBuffer* payloadBuffer) {
|
||||
transport->ensureData(1);
|
||||
int8 qos = payloadBuffer->getByte();
|
||||
Status* status = statusCreate->deserializeStatus(payloadBuffer, transport);
|
||||
transport->getIntrospectionRegistry()->deserializeStatus(m_status, payloadBuffer, transport);
|
||||
|
||||
try
|
||||
{
|
||||
if (qos & QOS_INIT)
|
||||
{
|
||||
if (status->isSuccess())
|
||||
if (m_status.isSuccess())
|
||||
{
|
||||
// once created set destroy flag
|
||||
m_mutex.lock();
|
||||
@@ -159,7 +159,7 @@ namespace epics {
|
||||
m_mutex.unlock();
|
||||
}
|
||||
|
||||
initResponse(transport, version, payloadBuffer, qos, status);
|
||||
initResponse(transport, version, payloadBuffer, qos, m_status);
|
||||
}
|
||||
else if (qos & QOS_DESTROY)
|
||||
{
|
||||
@@ -167,24 +167,18 @@ namespace epics {
|
||||
m_remotelyDestroy = false;
|
||||
m_mutex.unlock();
|
||||
|
||||
if (!destroyResponse(transport, version, payloadBuffer, qos, status))
|
||||
if (!destroyResponse(transport, version, payloadBuffer, qos, m_status))
|
||||
cancel();
|
||||
}
|
||||
else
|
||||
{
|
||||
normalResponse(transport, version, payloadBuffer, qos, status);
|
||||
normalResponse(transport, version, payloadBuffer, qos, m_status);
|
||||
}
|
||||
}
|
||||
catch (std::exception &e) {
|
||||
errlogSevPrintf(errlogMajor, "Unhandled exception caught from client code at %s:%d: %s", __FILE__, __LINE__, e.what());
|
||||
// TODO
|
||||
if (status != okStatus)
|
||||
delete status;
|
||||
}
|
||||
catch (...) { errlogSevPrintf(errlogMajor, "Unhandled exception caught from client code at %s:%d.", __FILE__, __LINE__);
|
||||
// TODO
|
||||
if (status != okStatus)
|
||||
delete status;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -226,11 +220,11 @@ namespace epics {
|
||||
// TODO notify?
|
||||
}
|
||||
|
||||
void reportStatus(Status* status) {
|
||||
void reportStatus(const Status& status) {
|
||||
// destroy, since channel (parent) was destroyed
|
||||
if (status == ChannelImpl::channelDestroyed)
|
||||
if (&status == &ChannelImpl::channelDestroyed)
|
||||
destroy();
|
||||
else if (status == ChannelImpl::channelDisconnected)
|
||||
else if (&status == &ChannelImpl::channelDisconnected)
|
||||
stopRequest();
|
||||
// TODO notify?
|
||||
}
|
||||
@@ -280,14 +274,12 @@ namespace epics {
|
||||
|
||||
|
||||
|
||||
StatusCreate* BaseRequestImpl::statusCreate = getStatusCreate();
|
||||
PVDataCreate* BaseRequestImpl::pvDataCreate = getPVDataCreate();
|
||||
|
||||
Status* BaseRequestImpl::okStatus = getStatusCreate()->getStatusOK();;
|
||||
Status* BaseRequestImpl::destroyedStatus = getStatusCreate()->createStatus(STATUSTYPE_ERROR, "request destroyed");
|
||||
Status* BaseRequestImpl::channelNotConnected = getStatusCreate()->createStatus(STATUSTYPE_ERROR, "channel not connected");
|
||||
Status* BaseRequestImpl::otherRequestPendingStatus = getStatusCreate()->createStatus(STATUSTYPE_ERROR, "other request pending");
|
||||
Status* BaseRequestImpl::pvRequestNull = getStatusCreate()->createStatus(STATUSTYPE_ERROR, "pvRequest == 0");
|
||||
Status BaseRequestImpl::destroyedStatus = Status(Status::STATUSTYPE_ERROR, "request destroyed");
|
||||
Status BaseRequestImpl::channelNotConnected = Status(Status::STATUSTYPE_ERROR, "channel not connected");
|
||||
Status BaseRequestImpl::otherRequestPendingStatus = Status(Status::STATUSTYPE_ERROR, "other request pending");
|
||||
Status BaseRequestImpl::pvRequestNull = Status(Status::STATUSTYPE_ERROR, "pvRequest == 0");
|
||||
|
||||
|
||||
|
||||
@@ -352,17 +344,17 @@ namespace epics {
|
||||
stopRequest();
|
||||
}
|
||||
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
EXCEPTION_GUARD(m_callback->processDone(status));
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
EXCEPTION_GUARD(m_callback->channelProcessConnect(status, this));
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
EXCEPTION_GUARD(m_callback->processDone(status));
|
||||
return true;
|
||||
}
|
||||
@@ -386,6 +378,7 @@ namespace epics {
|
||||
try {
|
||||
m_channel->checkAndGetTransport()->enqueueSendRequest(this);
|
||||
} catch (std::runtime_error &rte) {
|
||||
stopRequest();
|
||||
EXCEPTION_GUARD(m_callback->processDone(channelNotConnected));
|
||||
}
|
||||
}
|
||||
@@ -477,15 +470,15 @@ namespace epics {
|
||||
stopRequest();
|
||||
}
|
||||
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
// data available
|
||||
if (qos & QOS_GET)
|
||||
return normalResponse(transport, version, payloadBuffer, qos, status);
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
if (!status->isSuccess())
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
if (!status.isSuccess())
|
||||
{
|
||||
EXCEPTION_GUARD(m_channelGetRequester->channelGetConnect(status, this, 0, 0));
|
||||
return true;
|
||||
@@ -500,8 +493,8 @@ namespace epics {
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
if (!status->isSuccess())
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
if (!status.isSuccess())
|
||||
{
|
||||
EXCEPTION_GUARD(m_channelGetRequester->getDone(status));
|
||||
return true;
|
||||
@@ -533,6 +526,7 @@ namespace epics {
|
||||
try {
|
||||
m_channel->checkAndGetTransport()->enqueueSendRequest(this);
|
||||
} catch (std::runtime_error &rte) {
|
||||
stopRequest();
|
||||
EXCEPTION_GUARD(m_channelGetRequester->getDone(channelNotConnected));
|
||||
}
|
||||
}
|
||||
@@ -635,13 +629,13 @@ namespace epics {
|
||||
stopRequest();
|
||||
}
|
||||
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
EXCEPTION_GUARD(m_channelPutRequester->putDone(status));
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
if (!status->isSuccess())
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
if (!status.isSuccess())
|
||||
{
|
||||
EXCEPTION_GUARD(m_channelPutRequester->channelPutConnect(status, this, 0, 0));
|
||||
return true;
|
||||
@@ -656,10 +650,10 @@ namespace epics {
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
if (qos & QOS_GET)
|
||||
{
|
||||
if (!status->isSuccess())
|
||||
if (!status.isSuccess())
|
||||
{
|
||||
EXCEPTION_GUARD(m_channelPutRequester->getDone(status));
|
||||
return true;
|
||||
@@ -694,6 +688,7 @@ namespace epics {
|
||||
try {
|
||||
m_channel->checkAndGetTransport()->enqueueSendRequest(this);
|
||||
} catch (std::runtime_error &rte) {
|
||||
stopRequest();
|
||||
EXCEPTION_GUARD(m_channelPutRequester->getDone(channelNotConnected));
|
||||
}
|
||||
}
|
||||
@@ -714,6 +709,7 @@ namespace epics {
|
||||
try {
|
||||
m_channel->checkAndGetTransport()->enqueueSendRequest(this);
|
||||
} catch (std::runtime_error &rte) {
|
||||
stopRequest();
|
||||
EXCEPTION_GUARD(m_channelPutRequester->putDone(channelNotConnected));
|
||||
}
|
||||
}
|
||||
@@ -814,14 +810,14 @@ namespace epics {
|
||||
stopRequest();
|
||||
}
|
||||
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
// data available
|
||||
// TODO we need a flag here...
|
||||
return normalResponse(transport, version, payloadBuffer, qos, status);
|
||||
}
|
||||
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
if (!status->isSuccess())
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
if (!status.isSuccess())
|
||||
{
|
||||
EXCEPTION_GUARD(m_channelPutGetRequester->channelPutGetConnect(status, this, 0, 0));
|
||||
return true;
|
||||
@@ -837,10 +833,10 @@ namespace epics {
|
||||
}
|
||||
|
||||
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
if (qos & QOS_GET)
|
||||
{
|
||||
if (!status->isSuccess())
|
||||
if (!status.isSuccess())
|
||||
{
|
||||
EXCEPTION_GUARD(m_channelPutGetRequester->getGetDone(status));
|
||||
return true;
|
||||
@@ -854,7 +850,7 @@ namespace epics {
|
||||
}
|
||||
else if (qos & QOS_GET_PUT)
|
||||
{
|
||||
if (!status->isSuccess())
|
||||
if (!status.isSuccess())
|
||||
{
|
||||
EXCEPTION_GUARD(m_channelPutGetRequester->getPutDone(status));
|
||||
return true;
|
||||
@@ -868,7 +864,7 @@ namespace epics {
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!status->isSuccess())
|
||||
if (!status.isSuccess())
|
||||
{
|
||||
EXCEPTION_GUARD(m_channelPutGetRequester->putGetDone(status));
|
||||
return true;
|
||||
@@ -897,6 +893,7 @@ namespace epics {
|
||||
try {
|
||||
m_channel->checkAndGetTransport()->enqueueSendRequest(this);
|
||||
} catch (std::runtime_error &rte) {
|
||||
stopRequest();
|
||||
EXCEPTION_GUARD(m_channelPutGetRequester->putGetDone(channelNotConnected));
|
||||
}
|
||||
}
|
||||
@@ -915,6 +912,7 @@ namespace epics {
|
||||
try {
|
||||
m_channel->checkAndGetTransport()->enqueueSendRequest(this);
|
||||
} catch (std::runtime_error &rte) {
|
||||
stopRequest();
|
||||
EXCEPTION_GUARD(m_channelPutGetRequester->getGetDone(channelNotConnected));
|
||||
}
|
||||
}
|
||||
@@ -933,6 +931,7 @@ namespace epics {
|
||||
try {
|
||||
m_channel->checkAndGetTransport()->enqueueSendRequest(this);
|
||||
} catch (std::runtime_error &rte) {
|
||||
stopRequest();
|
||||
EXCEPTION_GUARD(m_channelPutGetRequester->getPutDone(channelNotConnected));
|
||||
}
|
||||
}
|
||||
@@ -1032,14 +1031,14 @@ namespace epics {
|
||||
stopRequest();
|
||||
}
|
||||
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
// data available
|
||||
// TODO we need a flag here...
|
||||
return normalResponse(transport, version, payloadBuffer, qos, status);
|
||||
}
|
||||
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
if (!status->isSuccess())
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
if (!status.isSuccess())
|
||||
{
|
||||
EXCEPTION_GUARD(m_channelRPCRequester->channelRPCConnect(status, this, 0, 0));
|
||||
return true;
|
||||
@@ -1054,8 +1053,8 @@ namespace epics {
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
if (!status->isSuccess())
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
if (!status.isSuccess())
|
||||
{
|
||||
EXCEPTION_GUARD(m_channelRPCRequester->requestDone(status, 0));
|
||||
return true;
|
||||
@@ -1084,6 +1083,7 @@ namespace epics {
|
||||
try {
|
||||
m_channel->checkAndGetTransport()->enqueueSendRequest(this);
|
||||
} catch (std::runtime_error &rte) {
|
||||
stopRequest();
|
||||
EXCEPTION_GUARD(m_channelRPCRequester->requestDone(channelNotConnected, 0));
|
||||
}
|
||||
}
|
||||
@@ -1194,15 +1194,15 @@ namespace epics {
|
||||
stopRequest();
|
||||
}
|
||||
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
// data available (get with destroy)
|
||||
if (qos & QOS_GET)
|
||||
return normalResponse(transport, version, payloadBuffer, qos, status);
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
if (!status->isSuccess())
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
if (!status.isSuccess())
|
||||
{
|
||||
EXCEPTION_GUARD(m_channelArrayRequester->channelArrayConnect(status, this, 0));
|
||||
return true;
|
||||
@@ -1217,10 +1217,10 @@ namespace epics {
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
if (qos & QOS_GET)
|
||||
{
|
||||
if (!status->isSuccess())
|
||||
if (!status.isSuccess())
|
||||
{
|
||||
m_channelArrayRequester->getArrayDone(status);
|
||||
return true;
|
||||
@@ -1262,6 +1262,7 @@ namespace epics {
|
||||
m_count = count;
|
||||
m_channel->checkAndGetTransport()->enqueueSendRequest(this);
|
||||
} catch (std::runtime_error &rte) {
|
||||
stopRequest();
|
||||
EXCEPTION_GUARD(m_channelArrayRequester->getArrayDone(channelNotConnected));
|
||||
}
|
||||
}
|
||||
@@ -1284,6 +1285,7 @@ namespace epics {
|
||||
m_count = count;
|
||||
m_channel->checkAndGetTransport()->enqueueSendRequest(this);
|
||||
} catch (std::runtime_error &rte) {
|
||||
stopRequest();
|
||||
EXCEPTION_GUARD(m_channelArrayRequester->putArrayDone(channelNotConnected));
|
||||
}
|
||||
}
|
||||
@@ -1306,6 +1308,7 @@ namespace epics {
|
||||
m_capacity = capacity;
|
||||
m_channel->checkAndGetTransport()->enqueueSendRequest(this);
|
||||
} catch (std::runtime_error &rte) {
|
||||
stopRequest();
|
||||
EXCEPTION_GUARD(m_channelArrayRequester->setLengthDone(channelNotConnected));
|
||||
}
|
||||
}
|
||||
@@ -1401,9 +1404,9 @@ namespace epics {
|
||||
cancel();
|
||||
}
|
||||
|
||||
void reportStatus(Status* status) {
|
||||
void reportStatus(const Status& status) {
|
||||
// destroy, since channel (parent) was destroyed
|
||||
if (status == ChannelImpl::channelDestroyed)
|
||||
if (&status == &ChannelImpl::channelDestroyed)
|
||||
destroy();
|
||||
// TODO notify?
|
||||
}
|
||||
@@ -1442,11 +1445,10 @@ namespace epics {
|
||||
}
|
||||
|
||||
virtual void response(Transport* transport, int8 version, ByteBuffer* payloadBuffer) {
|
||||
// TODO?
|
||||
// try
|
||||
// {
|
||||
Status* status = BaseRequestImpl::statusCreate->deserializeStatus(payloadBuffer, transport);
|
||||
if (status->isSuccess())
|
||||
|
||||
Status status;
|
||||
transport->getIntrospectionRegistry()->deserializeStatus(status, payloadBuffer, transport);
|
||||
if (status.isSuccess())
|
||||
{
|
||||
// deserialize Field...
|
||||
const Field* field = transport->getIntrospectionRegistry()->deserialize(payloadBuffer, transport);
|
||||
@@ -1458,16 +1460,6 @@ namespace epics {
|
||||
EXCEPTION_GUARD(m_callback->getDone(status, 0));
|
||||
}
|
||||
|
||||
// TODO
|
||||
if (status != BaseRequestImpl::okStatus)
|
||||
delete status;
|
||||
// } // TODO guard callback
|
||||
// finally
|
||||
// {
|
||||
// always cancel request
|
||||
// cancel();
|
||||
// }
|
||||
|
||||
cancel();
|
||||
|
||||
}
|
||||
@@ -1531,12 +1523,12 @@ namespace epics {
|
||||
m_gotMonitor = false;
|
||||
}
|
||||
|
||||
Status* start() {
|
||||
return 0;
|
||||
Status start() {
|
||||
return Status::OK;
|
||||
}
|
||||
|
||||
Status* stop() {
|
||||
return 0;
|
||||
Status stop() {
|
||||
return Status::OK;
|
||||
}
|
||||
|
||||
void destroy() {
|
||||
@@ -1620,14 +1612,14 @@ namespace epics {
|
||||
m_gotMonitor = false;
|
||||
}
|
||||
|
||||
Status* start() {
|
||||
Status start() {
|
||||
Lock guard(&m_mutex);
|
||||
m_gotMonitor = false;
|
||||
return 0;
|
||||
return Status::OK;
|
||||
}
|
||||
|
||||
Status* stop() {
|
||||
return 0;
|
||||
Status stop() {
|
||||
return Status::OK;
|
||||
}
|
||||
|
||||
void destroy() {
|
||||
@@ -1757,16 +1749,18 @@ namespace epics {
|
||||
m_gotMonitor = false;
|
||||
}
|
||||
|
||||
Status* start() {
|
||||
Status start() {
|
||||
Lock guard(&m_mutex);
|
||||
if (!m_monitorElementChangeBitSet)
|
||||
return Status(Status::STATUSTYPE_ERROR, "Monitor not connected.");
|
||||
m_gotMonitor = false;
|
||||
m_monitorElementChangeBitSet->clear();
|
||||
m_monitorElementOverrunBitSet->clear();
|
||||
return 0;
|
||||
return Status::OK;
|
||||
}
|
||||
|
||||
Status* stop() {
|
||||
return 0;
|
||||
Status stop() {
|
||||
return Status::OK;
|
||||
}
|
||||
|
||||
void destroy() {
|
||||
@@ -1847,9 +1841,8 @@ namespace epics {
|
||||
|
||||
if ((buffer >> queueSize).fail())
|
||||
{
|
||||
Status* failedToConvert = getStatusCreate()->createStatus(STATUSTYPE_ERROR, "queueSize type is not a valid integer");
|
||||
Status failedToConvert(Status::STATUSTYPE_ERROR, "queueSize type is not a valid integer");
|
||||
EXCEPTION_GUARD(m_monitorRequester->monitorConnect(failedToConvert, 0, 0));
|
||||
delete failedToConvert;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -1896,14 +1889,14 @@ namespace epics {
|
||||
stopRequest();
|
||||
}
|
||||
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
// data available
|
||||
// TODO if (qos & QOS_GET)
|
||||
return normalResponse(transport, version, payloadBuffer, qos, status);
|
||||
}
|
||||
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
if (!status->isSuccess())
|
||||
virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
if (!status.isSuccess())
|
||||
{
|
||||
EXCEPTION_GUARD(m_monitorRequester->monitorConnect(status, this, 0));
|
||||
return true;
|
||||
@@ -1917,12 +1910,12 @@ namespace epics {
|
||||
structure->decReferenceCount();
|
||||
|
||||
if (m_started)
|
||||
delete start();
|
||||
start();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) {
|
||||
virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) {
|
||||
if (qos & QOS_GET)
|
||||
{
|
||||
// TODO not supported by IF yet...
|
||||
@@ -1941,86 +1934,76 @@ namespace epics {
|
||||
|
||||
// override, since we optimize status
|
||||
virtual void response(Transport* transport, int8 version, ByteBuffer* payloadBuffer) {
|
||||
// TODO?
|
||||
// try
|
||||
// {
|
||||
|
||||
transport->ensureData(1);
|
||||
int8 qos = payloadBuffer->getByte();
|
||||
if (qos & QOS_INIT)
|
||||
{
|
||||
Status* status = statusCreate->deserializeStatus(payloadBuffer, transport);
|
||||
Status status;
|
||||
transport->getIntrospectionRegistry()->deserializeStatus(status, payloadBuffer, transport);
|
||||
initResponse(transport, version, payloadBuffer, qos, status);
|
||||
// TODO
|
||||
if (status != okStatus)
|
||||
delete status;
|
||||
}
|
||||
else if (qos & QOS_DESTROY)
|
||||
{
|
||||
Status* status = statusCreate->deserializeStatus(payloadBuffer, transport);
|
||||
Status status;
|
||||
transport->getIntrospectionRegistry()->deserializeStatus(status, payloadBuffer, transport);
|
||||
m_remotelyDestroy = true;
|
||||
|
||||
if (!destroyResponse(transport, version, payloadBuffer, qos, status))
|
||||
cancel();
|
||||
// TODO
|
||||
if (status != okStatus)
|
||||
delete status;
|
||||
}
|
||||
else
|
||||
{
|
||||
normalResponse(transport, version, payloadBuffer, qos, okStatus);
|
||||
normalResponse(transport, version, payloadBuffer, qos, Status::OK);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
virtual Status* start()
|
||||
virtual Status start()
|
||||
{
|
||||
Lock guard(&m_mutex);
|
||||
|
||||
if (m_destroyed)
|
||||
return getStatusCreate()->createStatus(STATUSTYPE_ERROR, "Monitor destroyed.");;
|
||||
|
||||
return BaseRequestImpl::destroyedStatus;
|
||||
|
||||
m_monitorStrategy->start();
|
||||
|
||||
// start == process + get
|
||||
if (!startRequest(QOS_PROCESS | QOS_GET))
|
||||
{
|
||||
return getStatusCreate()->createStatus(STATUSTYPE_ERROR, "Other request pending.");
|
||||
}
|
||||
return BaseRequestImpl::otherRequestPendingStatus;
|
||||
|
||||
try
|
||||
{
|
||||
m_channel->checkAndGetTransport()->enqueueSendRequest(this);
|
||||
m_started = true;
|
||||
// client needs to delete status, so passing shared OK instance is not right thing to do
|
||||
return getStatusCreate()->createStatus(STATUSTYPE_OK, "Monitor started.");
|
||||
return Status::OK;
|
||||
} catch (std::runtime_error &rte) {
|
||||
return getStatusCreate()->createStatus(STATUSTYPE_ERROR, "channel not connected.");
|
||||
stopRequest();
|
||||
return BaseRequestImpl::channelNotConnected;
|
||||
}
|
||||
}
|
||||
|
||||
virtual Status* stop()
|
||||
virtual Status stop()
|
||||
{
|
||||
Lock guard(&m_mutex);
|
||||
|
||||
if (m_destroyed)
|
||||
return getStatusCreate()->createStatus(STATUSTYPE_ERROR, "Monitor destroyed.");;
|
||||
return BaseRequestImpl::destroyedStatus;
|
||||
|
||||
m_monitorStrategy->stop();
|
||||
|
||||
// stop == process + no get
|
||||
if (!startRequest(QOS_PROCESS))
|
||||
{
|
||||
return getStatusCreate()->createStatus(STATUSTYPE_ERROR, "Other request pending.");
|
||||
}
|
||||
return BaseRequestImpl::otherRequestPendingStatus;
|
||||
|
||||
try
|
||||
{
|
||||
m_channel->checkAndGetTransport()->enqueueSendRequest(this);
|
||||
m_started = false;
|
||||
// client needs to delete status, so passing shared OK instance is not right thing to do
|
||||
return getStatusCreate()->createStatus(STATUSTYPE_OK, "Monitor stopped.");
|
||||
return Status::OK;
|
||||
} catch (std::runtime_error &rte) {
|
||||
return getStatusCreate()->createStatus(STATUSTYPE_ERROR, "channel not connected.");
|
||||
stopRequest();
|
||||
return BaseRequestImpl::channelNotConnected;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2349,14 +2332,15 @@ namespace epics {
|
||||
transport->ensureData(8);
|
||||
pvAccessID cid = payloadBuffer->getInt();
|
||||
pvAccessID sid = payloadBuffer->getInt();
|
||||
// TODO... do not destroy OK
|
||||
Status* status = transport->getIntrospectionRegistry()->deserializeStatus(payloadBuffer, transport);
|
||||
|
||||
Status status;
|
||||
transport->getIntrospectionRegistry()->deserializeStatus(status, payloadBuffer, transport);
|
||||
|
||||
ChannelImpl* channel = static_cast<ChannelImpl*>(_context->getChannel(cid));
|
||||
if (channel)
|
||||
{
|
||||
// failed check
|
||||
if (!status->isSuccess()) {
|
||||
if (!status.isSuccess()) {
|
||||
channel->createChannelFailed();
|
||||
return;
|
||||
}
|
||||
@@ -2365,11 +2349,6 @@ namespace epics {
|
||||
|
||||
channel->connectionCompleted(sid);
|
||||
}
|
||||
|
||||
// TODO not nice
|
||||
if (status != BaseRequestImpl::okStatus)
|
||||
delete status;
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
@@ -3141,8 +3120,7 @@ namespace epics {
|
||||
*/
|
||||
void disconnectPendingIO(bool destroy)
|
||||
{
|
||||
// TODO destroy????!!
|
||||
Status* status = destroy ? channelDestroyed : channelDisconnected;
|
||||
Status* status = destroy ? &channelDestroyed : &channelDisconnected;
|
||||
|
||||
Lock guard(&m_responseRequestsMutex);
|
||||
|
||||
@@ -3159,7 +3137,7 @@ namespace epics {
|
||||
|
||||
for (int i = 0; i< count; i++)
|
||||
{
|
||||
EXCEPTION_GUARD(rrs[i]->reportStatus(status));
|
||||
EXCEPTION_GUARD(rrs[i]->reportStatus(*status));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3345,8 +3323,8 @@ namespace epics {
|
||||
if (!channelFindRequester)
|
||||
throw std::runtime_error("0 requester");
|
||||
|
||||
std::auto_ptr<Status> errorStatus(getStatusCreate()->createStatus(STATUSTYPE_ERROR, "not implemented", 0));
|
||||
channelFindRequester->channelFindResult(errorStatus.get(), 0, false);
|
||||
Status errorStatus(Status::STATUSTYPE_ERROR, "not implemented", 0);
|
||||
channelFindRequester->channelFindResult(errorStatus, 0, false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3367,7 +3345,7 @@ namespace epics {
|
||||
// TODO support addressList
|
||||
Channel* channel = m_context->createChannelInternal(channelName, channelRequester, priority, 0);
|
||||
if (channel)
|
||||
channelRequester->channelCreated(getStatusCreate()->getStatusOK(), channel);
|
||||
channelRequester->channelCreated(Status::OK, channel);
|
||||
return channel;
|
||||
|
||||
// NOTE it's up to internal code to respond w/ error to requester and return 0 in case of errors
|
||||
|
||||
@@ -37,8 +37,8 @@ namespace epics {
|
||||
virtual Transport* checkAndGetTransport() = 0;
|
||||
virtual Transport* getTransport() = 0;
|
||||
|
||||
static Status* channelDestroyed;
|
||||
static Status* channelDisconnected;
|
||||
static Status channelDestroyed;
|
||||
static Status channelDisconnected;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -234,7 +234,7 @@ namespace epics {
|
||||
return this;
|
||||
}
|
||||
|
||||
void ChannelFindRequesterImpl::channelFindResult(epics::pvData::Status* status, ChannelFind* channelFind, boolean wasFound)
|
||||
void ChannelFindRequesterImpl::channelFindResult(const epics::pvData::Status& status, ChannelFind* channelFind, boolean wasFound)
|
||||
{
|
||||
// TODO status
|
||||
Lock guard(_mutex);
|
||||
@@ -318,13 +318,13 @@ namespace epics {
|
||||
_transport(transport),
|
||||
_channelName(channelName),
|
||||
_cid(cid),
|
||||
_status(NULL),
|
||||
_status(),
|
||||
_channel(NULL)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ChannelRequesterImpl::channelCreated(Status* const status, Channel* const channel)
|
||||
void ChannelRequesterImpl::channelCreated(const Status& status, Channel* const channel)
|
||||
{
|
||||
Lock guard(_mutex);
|
||||
_status = status;
|
||||
|
||||
@@ -181,7 +181,7 @@ namespace epics {
|
||||
ChannelFindRequesterImpl(ServerContextImpl* context, ChannelFindRequesterImplObjectPool* objectPool);
|
||||
void clear();
|
||||
ChannelFindRequesterImpl* set(int32 searchSequenceId, int32 cid, osiSockAddr* sendTo, boolean responseRequired);
|
||||
void channelFindResult(epics::pvData::Status* status, ChannelFind* channelFind, boolean wasFound);
|
||||
void channelFindResult(const epics::pvData::Status& status, ChannelFind* channelFind, boolean wasFound);
|
||||
void lock();
|
||||
void unlock();
|
||||
void acquire();
|
||||
@@ -237,7 +237,7 @@ namespace epics {
|
||||
{
|
||||
public:
|
||||
ChannelRequesterImpl(Transport* transport, const String channelName, const int32 cid);
|
||||
void channelCreated(Status* const status, Channel* const channel);
|
||||
void channelCreated(const Status& status, Channel* const channel);
|
||||
void channelStateChange(Channel* const c, const Channel::ConnectionState isConnected);
|
||||
String getRequesterName();
|
||||
void message(const String message, const epics::pvData::MessageType messageType);
|
||||
@@ -249,7 +249,7 @@ namespace epics {
|
||||
Transport* _transport;
|
||||
const String _channelName;
|
||||
const int32 _cid;
|
||||
Status* _status;
|
||||
Status _status;
|
||||
Channel* _channel;
|
||||
epics::pvData::Mutex _mutex;
|
||||
void createChannelFailedResponse(ByteBuffer* buffer, TransportSendControl* control, Status* const status);
|
||||
|
||||
@@ -73,9 +73,7 @@ namespace epics {
|
||||
v->push_back(pNewNode);
|
||||
}
|
||||
|
||||
/* port of osiSockDiscoverBroadcastAddresses() in
|
||||
* epics/base/src/libCom/osi/os/default/osdNetIntf.c
|
||||
*/
|
||||
// TODO use osiSockDiscoverBroadcastAddresses() from epics/base/src/libCom/osi/os/default/osdNetIntf.c
|
||||
InetAddrVector* getBroadcastAddresses(SOCKET sock,
|
||||
in_port_t defaultPort) {
|
||||
static const unsigned nelem = 100;
|
||||
|
||||
@@ -10,14 +10,12 @@ const int8 IntrospectionRegistry::NULL_TYPE_CODE = (int8)-1;
|
||||
const int8 IntrospectionRegistry::ONLY_ID_TYPE_CODE = (int8)-2;
|
||||
const int8 IntrospectionRegistry::FULL_WITH_ID_TYPE_CODE = (int8)-3;
|
||||
PVDataCreate* IntrospectionRegistry::_pvDataCreate = 0;
|
||||
StatusCreate* IntrospectionRegistry::_statusCreate = 0;
|
||||
FieldCreate* IntrospectionRegistry::_fieldCreate = 0;
|
||||
|
||||
IntrospectionRegistry::IntrospectionRegistry(bool serverSide) : _mutex(Mutex())
|
||||
{
|
||||
// TODO not optimal
|
||||
_pvDataCreate = getPVDataCreate();
|
||||
_statusCreate = getStatusCreate();
|
||||
_fieldCreate = getFieldCreate();
|
||||
|
||||
_direction = serverSide ? 1 : -1;
|
||||
@@ -359,14 +357,14 @@ PVStructurePtr IntrospectionRegistry::deserializeStructureAndCreatePVStructure(B
|
||||
return retVal;
|
||||
}
|
||||
|
||||
void IntrospectionRegistry::serializeStatus(ByteBuffer* buffer, SerializableControl* control, Status* status)
|
||||
void IntrospectionRegistry::serializeStatus(ByteBuffer* buffer, SerializableControl* control, const Status& status)
|
||||
{
|
||||
status->serialize(buffer, control);
|
||||
status.serialize(buffer, control);
|
||||
}
|
||||
|
||||
Status* IntrospectionRegistry::deserializeStatus(ByteBuffer* buffer, DeserializableControl* control)
|
||||
void IntrospectionRegistry::deserializeStatus(Status &status, ByteBuffer* buffer, DeserializableControl* control)
|
||||
{
|
||||
return _statusCreate->deserializeStatus(buffer, control);
|
||||
status.deserialize(buffer, control);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -208,7 +208,7 @@ typedef std::map<const short,const Field*> registryMap_t;
|
||||
* @param control serialization control.
|
||||
* @param status status to serialize.
|
||||
*/
|
||||
void serializeStatus(ByteBuffer* buffer, SerializableControl* control, Status* status);
|
||||
void serializeStatus(ByteBuffer* buffer, SerializableControl* control, const Status &status);
|
||||
|
||||
/**
|
||||
* Deserialize status.
|
||||
@@ -216,7 +216,7 @@ typedef std::map<const short,const Field*> registryMap_t;
|
||||
* @param buffer data buffer.
|
||||
* @param control serialization control.
|
||||
*/
|
||||
Status* deserializeStatus(ByteBuffer* buffer, DeserializableControl* control);
|
||||
void deserializeStatus(Status &status, ByteBuffer* buffer, DeserializableControl* control);
|
||||
|
||||
private:
|
||||
registryMap_t _registry;
|
||||
@@ -231,11 +231,6 @@ typedef std::map<const short,const Field*> registryMap_t;
|
||||
*/
|
||||
static PVDataCreate* _pvDataCreate;
|
||||
|
||||
/**
|
||||
* Status factory.
|
||||
*/
|
||||
static StatusCreate* _statusCreate;
|
||||
|
||||
/**
|
||||
* Field factory.
|
||||
*/
|
||||
|
||||
@@ -10,9 +10,9 @@ PROD_HOST += testCreateRequest
|
||||
testCreateRequest_SRCS += testCreateRequest.cpp
|
||||
testCreateRequest_LIBS += pvData pvAccess Com
|
||||
|
||||
PROD_HOST += testMockClient
|
||||
testMockClient_SRCS = testMockClient.cpp MockClientImpl.cpp
|
||||
testMockClient_LIBS = pvData pvAccess Com
|
||||
#PROD_HOST += testMockClient
|
||||
#testMockClient_SRCS = testMockClient.cpp MockClientImpl.cpp
|
||||
#testMockClient_LIBS = pvData pvAccess Com
|
||||
|
||||
include $(TOP)/configure/RULES
|
||||
#----------------------------------------
|
||||
|
||||
@@ -16,10 +16,10 @@ using namespace epics::pvAccess;
|
||||
|
||||
class ChannelFindRequesterImpl : public ChannelFindRequester
|
||||
{
|
||||
virtual void channelFindResult(epics::pvData::Status *status,ChannelFind *channelFind,bool wasFound)
|
||||
virtual void channelFindResult(const epics::pvData::Status& status,ChannelFind *channelFind,bool wasFound)
|
||||
{
|
||||
std::cout << "[ChannelFindRequesterImpl] channelFindResult("
|
||||
<< status->toString() << ", ..., " << wasFound << ")" << std::endl;
|
||||
<< status.toString() << ", ..., " << wasFound << ")" << std::endl;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -35,9 +35,9 @@ class ChannelRequesterImpl : public ChannelRequester
|
||||
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl;
|
||||
}
|
||||
|
||||
virtual void channelCreated(epics::pvData::Status* status, Channel *channel)
|
||||
virtual void channelCreated(const epics::pvData::Status& status, Channel *channel)
|
||||
{
|
||||
std::cout << "channelCreated(" << status->toString() << ", "
|
||||
std::cout << "channelCreated(" << status.toString() << ", "
|
||||
<< (channel ? channel->getChannelName() : "(0)") << ")" << std::endl;
|
||||
}
|
||||
|
||||
@@ -59,9 +59,9 @@ class GetFieldRequesterImpl : public GetFieldRequester
|
||||
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl;
|
||||
}
|
||||
|
||||
virtual void getDone(epics::pvData::Status *status,epics::pvData::FieldConstPtr field)
|
||||
virtual void getDone(const epics::pvData::Status& status,epics::pvData::FieldConstPtr field)
|
||||
{
|
||||
std::cout << "getDone(" << status->toString() << ", ";
|
||||
std::cout << "getDone(" << status.toString() << ", ";
|
||||
if (field)
|
||||
{
|
||||
String str;
|
||||
@@ -95,10 +95,10 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
|
||||
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl;
|
||||
}
|
||||
|
||||
virtual void channelGetConnect(epics::pvData::Status *status,ChannelGet *channelGet,
|
||||
virtual void channelGetConnect(const epics::pvData::Status& status,ChannelGet *channelGet,
|
||||
epics::pvData::PVStructure *pvStructure,epics::pvData::BitSet *bitSet)
|
||||
{
|
||||
std::cout << "channelGetConnect(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "channelGetConnect(" << status.toString() << ")" << std::endl;
|
||||
if (pvStructure)
|
||||
{
|
||||
String st;
|
||||
@@ -113,9 +113,9 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
|
||||
m_mutex.unlock();
|
||||
}
|
||||
|
||||
virtual void getDone(epics::pvData::Status *status)
|
||||
virtual void getDone(const epics::pvData::Status& status)
|
||||
{
|
||||
std::cout << "getDone(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "getDone(" << status.toString() << ")" << std::endl;
|
||||
Lock guard(&m_mutex);
|
||||
if (m_pvStructure)
|
||||
{
|
||||
@@ -143,10 +143,10 @@ class ChannelPutRequesterImpl : public ChannelPutRequester
|
||||
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl;
|
||||
}
|
||||
|
||||
virtual void channelPutConnect(epics::pvData::Status *status,ChannelPut *channelPut,
|
||||
virtual void channelPutConnect(const epics::pvData::Status& status,ChannelPut *channelPut,
|
||||
epics::pvData::PVStructure *pvStructure,epics::pvData::BitSet *bitSet)
|
||||
{
|
||||
std::cout << "channelPutConnect(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "channelPutConnect(" << status.toString() << ")" << std::endl;
|
||||
|
||||
// TODO sync
|
||||
m_channelPut = channelPut;
|
||||
@@ -154,9 +154,9 @@ class ChannelPutRequesterImpl : public ChannelPutRequester
|
||||
m_bitSet = bitSet;
|
||||
}
|
||||
|
||||
virtual void getDone(epics::pvData::Status *status)
|
||||
virtual void getDone(const epics::pvData::Status& status)
|
||||
{
|
||||
std::cout << "getDone(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "getDone(" << status.toString() << ")" << std::endl;
|
||||
if (m_pvStructure)
|
||||
{
|
||||
String str;
|
||||
@@ -166,9 +166,9 @@ class ChannelPutRequesterImpl : public ChannelPutRequester
|
||||
}
|
||||
}
|
||||
|
||||
virtual void putDone(epics::pvData::Status *status)
|
||||
virtual void putDone(const epics::pvData::Status& status)
|
||||
{
|
||||
std::cout << "putDone(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "putDone(" << status.toString() << ")" << std::endl;
|
||||
if (m_pvStructure)
|
||||
{
|
||||
String str;
|
||||
@@ -196,10 +196,10 @@ class ChannelPutGetRequesterImpl : public ChannelPutGetRequester
|
||||
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl;
|
||||
}
|
||||
|
||||
virtual void channelPutGetConnect(epics::pvData::Status *status,ChannelPutGet *channelPutGet,
|
||||
virtual void channelPutGetConnect(const epics::pvData::Status& status,ChannelPutGet *channelPutGet,
|
||||
epics::pvData::PVStructure *putData,epics::pvData::PVStructure *getData)
|
||||
{
|
||||
std::cout << "channelGetPutConnect(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "channelGetPutConnect(" << status.toString() << ")" << std::endl;
|
||||
// TODO sync
|
||||
m_channelPutGet = channelPutGet;
|
||||
m_putData = putData;
|
||||
@@ -221,9 +221,9 @@ class ChannelPutGetRequesterImpl : public ChannelPutGetRequester
|
||||
}
|
||||
}
|
||||
|
||||
virtual void getGetDone(epics::pvData::Status *status)
|
||||
virtual void getGetDone(const epics::pvData::Status& status)
|
||||
{
|
||||
std::cout << "getGetDone(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "getGetDone(" << status.toString() << ")" << std::endl;
|
||||
if (m_getData)
|
||||
{
|
||||
String str;
|
||||
@@ -233,9 +233,9 @@ class ChannelPutGetRequesterImpl : public ChannelPutGetRequester
|
||||
}
|
||||
}
|
||||
|
||||
virtual void getPutDone(epics::pvData::Status *status)
|
||||
virtual void getPutDone(const epics::pvData::Status& status)
|
||||
{
|
||||
std::cout << "getPutDone(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "getPutDone(" << status.toString() << ")" << std::endl;
|
||||
if (m_putData)
|
||||
{
|
||||
String str;
|
||||
@@ -245,9 +245,9 @@ class ChannelPutGetRequesterImpl : public ChannelPutGetRequester
|
||||
}
|
||||
}
|
||||
|
||||
virtual void putGetDone(epics::pvData::Status *status)
|
||||
virtual void putGetDone(const epics::pvData::Status& status)
|
||||
{
|
||||
std::cout << "putGetDone(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "putGetDone(" << status.toString() << ")" << std::endl;
|
||||
if (m_putData)
|
||||
{
|
||||
String str;
|
||||
@@ -276,10 +276,10 @@ class ChannelRPCRequesterImpl : public ChannelRPCRequester
|
||||
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl;
|
||||
}
|
||||
|
||||
virtual void channelRPCConnect(epics::pvData::Status *status,ChannelRPC *channelRPC,
|
||||
virtual void channelRPCConnect(const epics::pvData::Status& status,ChannelRPC *channelRPC,
|
||||
epics::pvData::PVStructure *pvStructure,epics::pvData::BitSet *bitSet)
|
||||
{
|
||||
std::cout << "channelRPCConnect(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "channelRPCConnect(" << status.toString() << ")" << std::endl;
|
||||
if (pvStructure)
|
||||
{
|
||||
String st;
|
||||
@@ -293,9 +293,9 @@ class ChannelRPCRequesterImpl : public ChannelRPCRequester
|
||||
m_bitSet = bitSet;
|
||||
}
|
||||
|
||||
virtual void requestDone(epics::pvData::Status *status,epics::pvData::PVStructure *pvResponse)
|
||||
virtual void requestDone(const epics::pvData::Status& status,epics::pvData::PVStructure *pvResponse)
|
||||
{
|
||||
std::cout << "requestDone(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "requestDone(" << status.toString() << ")" << std::endl;
|
||||
if (pvResponse)
|
||||
{
|
||||
String str;
|
||||
@@ -321,10 +321,10 @@ class ChannelArrayRequesterImpl : public ChannelArrayRequester
|
||||
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl;
|
||||
}
|
||||
|
||||
virtual void channelArrayConnect(epics::pvData::Status *status,ChannelArray *channelArray,
|
||||
virtual void channelArrayConnect(const epics::pvData::Status& status,ChannelArray *channelArray,
|
||||
epics::pvData::PVArray *pvArray)
|
||||
{
|
||||
std::cout << "channelArrayConnect(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "channelArrayConnect(" << status.toString() << ")" << std::endl;
|
||||
if (pvArray)
|
||||
{
|
||||
String st;
|
||||
@@ -337,9 +337,9 @@ class ChannelArrayRequesterImpl : public ChannelArrayRequester
|
||||
m_pvArray = pvArray;
|
||||
}
|
||||
|
||||
virtual void getArrayDone(epics::pvData::Status *status)
|
||||
virtual void getArrayDone(const epics::pvData::Status& status)
|
||||
{
|
||||
std::cout << "getArrayDone(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "getArrayDone(" << status.toString() << ")" << std::endl;
|
||||
if (m_pvArray)
|
||||
{
|
||||
String str;
|
||||
@@ -349,14 +349,14 @@ class ChannelArrayRequesterImpl : public ChannelArrayRequester
|
||||
}
|
||||
}
|
||||
|
||||
virtual void putArrayDone(epics::pvData::Status *status)
|
||||
virtual void putArrayDone(const epics::pvData::Status& status)
|
||||
{
|
||||
std::cout << "putArrayDone(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "putArrayDone(" << status.toString() << ")" << std::endl;
|
||||
}
|
||||
|
||||
virtual void setLengthDone(epics::pvData::Status *status)
|
||||
virtual void setLengthDone(const epics::pvData::Status& status)
|
||||
{
|
||||
std::cout << "setLengthDone(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "setLengthDone(" << status.toString() << ")" << std::endl;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -372,9 +372,9 @@ class MonitorRequesterImpl : public MonitorRequester
|
||||
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl;
|
||||
}
|
||||
|
||||
virtual void monitorConnect(Status* status, Monitor* monitor, Structure* structure)
|
||||
virtual void monitorConnect(const epics::pvData::Status& status, Monitor* monitor, Structure* structure)
|
||||
{
|
||||
std::cout << "monitorConnect(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "monitorConnect(" << status.toString() << ")" << std::endl;
|
||||
if (structure)
|
||||
{
|
||||
String str;
|
||||
@@ -421,17 +421,17 @@ class ChannelProcessRequesterImpl : public ChannelProcessRequester
|
||||
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl;
|
||||
}
|
||||
|
||||
virtual void channelProcessConnect(epics::pvData::Status *status,ChannelProcess *channelProcess)
|
||||
virtual void channelProcessConnect(const epics::pvData::Status& status,ChannelProcess *channelProcess)
|
||||
{
|
||||
std::cout << "channelProcessConnect(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "channelProcessConnect(" << status.toString() << ")" << std::endl;
|
||||
|
||||
// TODO sync
|
||||
m_channelProcess = channelProcess;
|
||||
}
|
||||
|
||||
virtual void processDone(epics::pvData::Status *status)
|
||||
virtual void processDone(const epics::pvData::Status& status)
|
||||
{
|
||||
std::cout << "processDone(" << status->toString() << ")" << std::endl;
|
||||
std::cout << "processDone(" << status.toString() << ")" << std::endl;
|
||||
}
|
||||
|
||||
};
|
||||
@@ -549,15 +549,13 @@ int main(int argc,char *argv[])
|
||||
|
||||
epicsThreadSleep( 1.0 );
|
||||
|
||||
Status* status = monitor->start();
|
||||
std::cout << "monitor->start() = " << status->toString() << std::endl;
|
||||
delete status;
|
||||
Status status = monitor->start();
|
||||
std::cout << "monitor->start() = " << status.toString() << std::endl;
|
||||
|
||||
epicsThreadSleep( 3.0 );
|
||||
|
||||
status = monitor->stop();
|
||||
std::cout << "monitor->stop() = " << status->toString() << std::endl;
|
||||
delete status;
|
||||
std::cout << "monitor->stop() = " << status.toString() << std::endl;
|
||||
|
||||
|
||||
monitor->destroy();
|
||||
|
||||
@@ -58,7 +58,6 @@ static DeserializableControl* control;
|
||||
static ByteBuffer* buffer;
|
||||
|
||||
static PVDataCreate* pvDataCreate;
|
||||
static StatusCreate* statusCreate;
|
||||
static FieldCreate* fieldCreate;
|
||||
static StandardField *standardField;
|
||||
|
||||
@@ -396,20 +395,20 @@ void testSerializeStatus()
|
||||
{
|
||||
buffer->clear();
|
||||
registry->reset();
|
||||
Status* statusIn = statusCreate->getStatusOK();
|
||||
Status statusIn(Status::STATUSTYPE_WARNING, "msg", "dumpy");
|
||||
registry->serializeStatus(buffer,flusher,statusIn);
|
||||
|
||||
buffer->flip();
|
||||
Status* statusOut= registry->deserializeStatus(buffer,control);
|
||||
assert(statusIn->getType() == statusOut->getType());
|
||||
delete statusOut;
|
||||
//TODO why are in and out on the same address?
|
||||
Status statusOut;
|
||||
registry->deserializeStatus(statusOut, buffer,control);
|
||||
assert(statusIn.getType() == statusOut.getType());
|
||||
assert(statusIn.getMessage() == statusOut.getMessage());
|
||||
assert(statusIn.getStackDump() == statusOut.getStackDump());
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
pvDataCreate = getPVDataCreate();
|
||||
statusCreate = getStatusCreate();
|
||||
fieldCreate = getFieldCreate();
|
||||
standardField = getStandardField();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user