summaryrefslogtreecommitdiff
path: root/cpp/src/Glacier2/RequestQueue.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Glacier2/RequestQueue.cpp')
-rw-r--r--cpp/src/Glacier2/RequestQueue.cpp51
1 files changed, 36 insertions, 15 deletions
diff --git a/cpp/src/Glacier2/RequestQueue.cpp b/cpp/src/Glacier2/RequestQueue.cpp
index 96ee3c3ac32..1b2cc9c005b 100644
--- a/cpp/src/Glacier2/RequestQueue.cpp
+++ b/cpp/src/Glacier2/RequestQueue.cpp
@@ -25,11 +25,11 @@ namespace Glacier2
// responsible for sending back the response. It's necessary because
// sending back the response might block.
//
-class AMI_Object_ice_invokeI : public AMI_Object_ice_invoke
+class AMI_Array_Object_ice_invokeI : public AMI_Array_Object_ice_invoke
{
public:
- AMI_Object_ice_invokeI(const RequestQueuePtr& requestQueue, const AMD_Object_ice_invokePtr& amdCB) :
+ AMI_Array_Object_ice_invokeI(const RequestQueuePtr& requestQueue, const AMD_Array_Object_ice_invokePtr& amdCB) :
_requestQueue(requestQueue),
_amdCB(amdCB)
{
@@ -37,7 +37,7 @@ public:
}
virtual void
- ice_response(bool ok, const std::vector<Byte>& outParams)
+ ice_response(bool ok, const pair<const Byte*, const Byte*>& outParams)
{
_requestQueue->addResponse(new Response(_amdCB, ok, outParams));
}
@@ -51,13 +51,13 @@ public:
private:
const RequestQueuePtr _requestQueue;
- const AMD_Object_ice_invokePtr _amdCB;
+ const AMD_Array_Object_ice_invokePtr _amdCB;
};
}
Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*, const Byte*>& inParams,
- const Current& current, bool forwardContext, const AMD_Object_ice_invokePtr& amdCB) :
+ const Current& current, bool forwardContext, const AMD_Array_Object_ice_invokePtr& amdCB) :
_proxy(proxy),
_inParams(inParams.first, inParams.second),
_current(current),
@@ -71,7 +71,7 @@ Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*,
if(!_proxy->ice_isTwoway())
{
bool ok = true;
- ByteSeq outParams;
+ pair<const Byte*, const Byte*> outParams(0, 0);
_amdCB->ice_response(ok, outParams);
}
@@ -86,16 +86,26 @@ Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*,
bool
Glacier2::Request::invoke(const RequestQueuePtr& requestQueue)
{
+ pair<const Byte*, const Byte*> inPair;
+ if(_inParams.size() == 0)
+ {
+ inPair.first = inPair.second = 0;
+ }
+ else
+ {
+ inPair.first = &_inParams[0];
+ inPair.second = inPair.first + _inParams.size();
+ }
if(_proxy->ice_isTwoway())
{
- AMI_Object_ice_invokePtr cb = new AMI_Object_ice_invokeI(requestQueue, _amdCB);
+ AMI_Array_Object_ice_invokePtr cb = new AMI_Array_Object_ice_invokeI(requestQueue, _amdCB);
if(_forwardContext)
{
- _proxy->ice_invoke_async(cb, _current.operation, _current.mode, _inParams, _current.ctx);
+ _proxy->ice_invoke_async(cb, _current.operation, _current.mode, inPair, _current.ctx);
}
else
{
- _proxy->ice_invoke_async(cb, _current.operation, _current.mode, _inParams);
+ _proxy->ice_invoke_async(cb, _current.operation, _current.mode, inPair);
}
return true; // A twoway method is being dispatched.
}
@@ -106,11 +116,11 @@ Glacier2::Request::invoke(const RequestQueuePtr& requestQueue)
ByteSeq outParams;
if(_forwardContext)
{
- _proxy->ice_invoke(_current.operation, _current.mode, _inParams, outParams, _current.ctx);
+ _proxy->ice_invoke(_current.operation, _current.mode, inPair, outParams, _current.ctx);
}
else
{
- _proxy->ice_invoke(_current.operation, _current.mode, _inParams, outParams);
+ _proxy->ice_invoke(_current.operation, _current.mode, inPair, outParams);
}
}
catch(const LocalException&)
@@ -163,14 +173,15 @@ Glacier2::Request::getConnection() const
return _proxy->ice_connection();
}
-Glacier2::Response::Response(const AMD_Object_ice_invokePtr& amdCB, bool ok, const ByteSeq& outParams) :
+Glacier2::Response::Response(const AMD_Array_Object_ice_invokePtr& amdCB, bool ok,
+ const pair<const Byte*, const Byte*>& outParams) :
_amdCB(amdCB),
_ok(ok),
- _outParams(outParams)
+ _outParams(outParams.first, outParams.second)
{
}
-Glacier2::Response::Response(const AMD_Object_ice_invokePtr& amdCB, const Exception& ex) :
+Glacier2::Response::Response(const AMD_Array_Object_ice_invokePtr& amdCB, const Exception& ex) :
_amdCB(amdCB),
_ok(false),
_exception(ex.ice_clone())
@@ -186,7 +197,17 @@ Glacier2::Response::invoke()
}
else
{
- _amdCB->ice_response(_ok, _outParams);
+ pair<const Byte*, const Byte*> outPair;
+ if(_outParams.size() == 0)
+ {
+ outPair.first = outPair.second = 0;
+ }
+ else
+ {
+ outPair.first = &_outParams[0];
+ outPair.second = outPair.first + _outParams.size();
+ }
+ _amdCB->ice_response(_ok, outPair);
}
}