summaryrefslogtreecommitdiff
path: root/cpp/test/Ice/echo/BlobjectI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/test/Ice/echo/BlobjectI.cpp')
-rw-r--r--cpp/test/Ice/echo/BlobjectI.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/cpp/test/Ice/echo/BlobjectI.cpp b/cpp/test/Ice/echo/BlobjectI.cpp
new file mode 100644
index 00000000000..14cd8a22506
--- /dev/null
+++ b/cpp/test/Ice/echo/BlobjectI.cpp
@@ -0,0 +1,118 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Ice/Ice.h>
+#include <BlobjectI.h>
+
+using namespace std;
+
+class Callback : public IceUtil::Shared
+{
+public:
+
+ Callback(const Ice::AMD_Object_ice_invokePtr& cb, bool twoway) :
+ _cb(cb), _twoway(twoway)
+ {
+ }
+
+ void response(bool ok, const vector<Ice::Byte>& encaps)
+ {
+ _cb->ice_response(ok, encaps);
+ }
+
+ void exception(const Ice::Exception& ex)
+ {
+ _cb->ice_exception(ex);
+ }
+
+ void sent(bool)
+ {
+ if(!_twoway)
+ {
+ _cb->ice_response(true, vector<Ice::Byte>());
+ }
+ }
+
+private:
+
+ Ice::AMD_Object_ice_invokePtr _cb;
+ bool _twoway;
+};
+typedef IceUtil::Handle<Callback> CallbackPtr;
+
+BlobjectI::BlobjectI() :
+ _startBatch(false)
+{
+}
+
+void
+BlobjectI::startBatch()
+{
+ assert(!_batchProxy);
+ _startBatch = true;
+}
+
+void
+BlobjectI::flushBatch()
+{
+ assert(_batchProxy);
+ _batchProxy->ice_flushBatchRequests();
+ _batchProxy = 0;
+}
+
+void
+BlobjectI::ice_invoke_async(const Ice::AMD_Object_ice_invokePtr& amdCb, const vector<Ice::Byte>& inEncaps,
+ const Ice::Current& current)
+{
+ const bool twoway = current.requestId > 0;
+ Ice::ObjectPrx obj = current.con->createProxy(current.id);
+ if(!twoway)
+ {
+ if(_startBatch)
+ {
+ _startBatch = false;
+ _batchProxy = obj->ice_batchOneway();
+ }
+ if(_batchProxy)
+ {
+ obj = _batchProxy;
+ }
+
+ if(!current.facet.empty())
+ {
+ obj = obj->ice_facet(current.facet);
+ }
+
+ if(_batchProxy)
+ {
+ vector<Ice::Byte> out;
+ obj->ice_invoke(current.operation, current.mode, inEncaps, out, current.ctx);
+ amdCb->ice_response(true, vector<Ice::Byte>());
+ }
+ else
+ {
+ CallbackPtr cb = new Callback(amdCb, false);
+ Ice::Callback_Object_ice_invokePtr del =
+ Ice::newCallback_Object_ice_invoke(cb, &Callback::response, &Callback::exception, &Callback::sent);
+ obj->ice_oneway()->begin_ice_invoke(current.operation, current.mode, inEncaps, current.ctx, del);
+ }
+ }
+ else
+ {
+ if(!current.facet.empty())
+ {
+ obj = obj->ice_facet(current.facet);
+ }
+
+ CallbackPtr cb = new Callback(amdCb, true);
+ Ice::Callback_Object_ice_invokePtr del =
+ Ice::newCallback_Object_ice_invoke(cb, &Callback::response, &Callback::exception, &Callback::sent);
+ obj->begin_ice_invoke(current.operation, current.mode, inEncaps, current.ctx, del);
+ }
+}