summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Glacier2/RequestQueue.cpp79
1 files changed, 52 insertions, 27 deletions
diff --git a/cpp/src/Glacier2/RequestQueue.cpp b/cpp/src/Glacier2/RequestQueue.cpp
index 233b46bc5c8..368846e67d9 100644
--- a/cpp/src/Glacier2/RequestQueue.cpp
+++ b/cpp/src/Glacier2/RequestQueue.cpp
@@ -20,39 +20,20 @@ namespace
{
//
-// AMI callback class for twoway requests
+// AMI base callback class for twoway/oneway requests
//
-class AMI_Array_Object_ice_invokeI : public AMI_Array_Object_ice_invoke, public Ice::AMISentCallback
+class IceInvokeI : public AMI_Array_Object_ice_invoke
{
public:
- AMI_Array_Object_ice_invokeI(const AMD_Object_ice_invokePtr& amdCB,
- const InstancePtr& instance,
- const ConnectionPtr& connection,
- bool oneway) :
+ IceInvokeI(const AMD_Object_ice_invokePtr& amdCB, const InstancePtr& instance, const ConnectionPtr& connection) :
_amdCB(amdCB),
_instance(instance),
- _connection(connection),
- _oneway(oneway)
+ _connection(connection)
{
}
virtual void
- ice_response(bool ok, const pair<const Byte*, const Byte*>& outParams)
- {
- _amdCB->ice_response(ok, outParams);
- }
-
- virtual void
- ice_sent()
- {
- if(_oneway)
- {
- _amdCB->ice_response(true, pair<const Byte*, const Byte*>(0, 0));
- }
- }
-
- virtual void
ice_exception(const Exception& ex)
{
//
@@ -80,12 +61,49 @@ public:
}
}
-private:
+protected:
const AMD_Object_ice_invokePtr _amdCB;
const InstancePtr _instance;
const ConnectionPtr _connection;
- const bool _oneway;
+};
+
+class TwowayIceInvokeI : public IceInvokeI
+{
+public:
+
+ TwowayIceInvokeI(const AMD_Object_ice_invokePtr& amdCB, const InstancePtr& instance, const ConnectionPtr& con) :
+ IceInvokeI(amdCB, instance, con)
+ {
+ }
+
+ virtual void
+ ice_response(bool ok, const pair<const Byte*, const Byte*>& outParams)
+ {
+ _amdCB->ice_response(ok, outParams);
+ }
+};
+
+class OnewayIceInvokeI : public IceInvokeI, public Ice::AMISentCallback
+{
+public:
+
+ OnewayIceInvokeI(const AMD_Object_ice_invokePtr& amdCB, const InstancePtr& instance, const ConnectionPtr& con) :
+ IceInvokeI(amdCB, instance, con)
+ {
+ }
+
+ virtual void
+ ice_response(bool ok, const pair<const Byte*, const Byte*>& outParams)
+ {
+ assert(false);
+ }
+
+ virtual void
+ ice_sent()
+ {
+ _amdCB->ice_response(true, pair<const Byte*, const Byte*>(0, 0));
+ }
};
}
@@ -161,8 +179,15 @@ Glacier2::Request::invoke(const InstancePtr& instance, const Ice::ConnectionPtr&
}
else
{
- AMI_Array_Object_ice_invokePtr amiCB =
- new AMI_Array_Object_ice_invokeI(_amdCB, instance, connection, !_proxy->ice_isTwoway());
+ AMI_Array_Object_ice_invokePtr amiCB;
+ if(_proxy->ice_isTwoway())
+ {
+ amiCB = new TwowayIceInvokeI(_amdCB, instance, connection);
+ }
+ else
+ {
+ amiCB = new OnewayIceInvokeI(_amdCB, instance, connection);
+ }
bool sent;
if(_forwardContext)