diff options
-rw-r--r-- | cpp/config/Make.rules | 2 | ||||
-rw-r--r-- | cpp/demo/IceStorm/clock/config_service | 2 | ||||
-rw-r--r-- | cpp/include/Ice/Object.h | 19 | ||||
-rw-r--r-- | cpp/include/Ice/OutgoingAsync.h | 2 | ||||
-rw-r--r-- | cpp/include/Ice/Proxy.h | 34 | ||||
-rw-r--r-- | cpp/src/Glacier2/Blobject.cpp | 4 | ||||
-rw-r--r-- | cpp/src/Glacier2/Blobject.h | 5 | ||||
-rw-r--r-- | cpp/src/Glacier2/ClientBlobject.cpp | 3 | ||||
-rw-r--r-- | cpp/src/Glacier2/ClientBlobject.h | 3 | ||||
-rw-r--r-- | cpp/src/Glacier2/RequestQueue.cpp | 6 | ||||
-rw-r--r-- | cpp/src/Glacier2/RequestQueue.h | 2 | ||||
-rw-r--r-- | cpp/src/Glacier2/ServerBlobject.cpp | 3 | ||||
-rw-r--r-- | cpp/src/Glacier2/ServerBlobject.h | 3 | ||||
-rw-r--r-- | cpp/src/Ice/Object.cpp | 46 | ||||
-rw-r--r-- | cpp/src/Ice/OutgoingAsync.cpp | 4 | ||||
-rw-r--r-- | cpp/src/Ice/Proxy.cpp | 64 | ||||
-rw-r--r-- | cpp/src/IceStorm/TopicI.cpp | 8 |
17 files changed, 175 insertions, 35 deletions
diff --git a/cpp/config/Make.rules b/cpp/config/Make.rules index 7c9cd4bd9e3..06443960aaa 100644 --- a/cpp/config/Make.rules +++ b/cpp/config/Make.rules @@ -17,7 +17,7 @@ prefix ?= /opt/Ice-$(VERSION) # Define OPTIMIZE as yes if you want to build with # optimization. Otherwise Ice is build with debug information. # -OPTIMIZE ?= yes +#OPTIMIZE = yes # # Define LP64 as yes or no if you want force a 32 or 64 bit. The diff --git a/cpp/demo/IceStorm/clock/config_service b/cpp/demo/IceStorm/clock/config_service index 18102a0f209..0bb9411a98a 100644 --- a/cpp/demo/IceStorm/clock/config_service +++ b/cpp/demo/IceStorm/clock/config_service @@ -6,7 +6,7 @@ IceBox.ServiceManager.Endpoints=tcp -p 9998 # # The IceStorm service # -IceBox.Service.IceStorm=IceStormService,30:create --Ice.Config=config +IceBox.Service.IceStorm=IceStormService,31:create --Ice.Config=config # # This property defines the home directory of the Freeze diff --git a/cpp/include/Ice/Object.h b/cpp/include/Ice/Object.h index 1520dc23995..c991c896e23 100644 --- a/cpp/include/Ice/Object.h +++ b/cpp/include/Ice/Object.h @@ -107,6 +107,25 @@ public: virtual IceInternal::DispatchStatus __dispatch(IceInternal::Incoming&, const Current&); }; +class ICE_API BlobjectArray : virtual public Object +{ +public: + + // Returns true if ok, false if user exception. + virtual bool ice_invoke(const std::pair<const Byte*, const Byte*>&, std::vector<Byte>&, const Current&) = 0; + virtual IceInternal::DispatchStatus __dispatch(IceInternal::Incoming&, const Current&); +}; + +class ICE_API BlobjectArrayAsync : virtual public Object +{ +public: + + // Returns true if ok, false if user exception. + virtual void ice_invoke_async(const AMD_Object_ice_invokePtr&, const std::pair<const Byte*, const Byte*>&, + const Current&) = 0; + virtual IceInternal::DispatchStatus __dispatch(IceInternal::Incoming&, const Current&); +}; + class ICE_API BlobjectAsync : virtual public Object { public: diff --git a/cpp/include/Ice/OutgoingAsync.h b/cpp/include/Ice/OutgoingAsync.h index cdb8d708e3e..ef12d8e1b52 100644 --- a/cpp/include/Ice/OutgoingAsync.h +++ b/cpp/include/Ice/OutgoingAsync.h @@ -76,7 +76,7 @@ public: virtual void ice_exception(const Ice::Exception&) = 0; void __invoke(const Ice::ObjectPrx&, const std::string& operation, OperationMode, - const std::vector<Byte>&, const Context&); + const std::pair<const Byte*, const Byte*>&, const Context&); protected: diff --git a/cpp/include/Ice/Proxy.h b/cpp/include/Ice/Proxy.h index ad62ed11017..2e93a2f764e 100644 --- a/cpp/include/Ice/Proxy.h +++ b/cpp/include/Ice/Proxy.h @@ -96,16 +96,25 @@ public: ::std::vector< ::std::string> ice_ids(const ::Ice::Context&); ::std::string ice_id(); ::std::string ice_id(const ::Ice::Context&); + + // Returns true if ok, false if user exception. bool ice_invoke(const ::std::string&, ::Ice::OperationMode, const ::std::vector< ::Ice::Byte>&, - ::std::vector< ::Ice::Byte>&); // Returns true if ok, false if user exception. + ::std::vector< ::Ice::Byte>&); bool ice_invoke(const ::std::string&, ::Ice::OperationMode, const ::std::vector< ::Ice::Byte>&, - ::std::vector< ::Ice::Byte>&, - const ::Ice::Context&); // Returns true if ok, false if user exception. - void ice_invoke_async(const ::Ice::AMI_Object_ice_invokePtr&, - const ::std::string&, ::Ice::OperationMode, const ::std::vector< ::Ice::Byte>&); - void ice_invoke_async(const ::Ice::AMI_Object_ice_invokePtr&, - const ::std::string&, ::Ice::OperationMode, const ::std::vector< ::Ice::Byte>&, - const ::Ice::Context&); + ::std::vector< ::Ice::Byte>&, const ::Ice::Context&); + bool ice_invoke(const ::std::string&, ::Ice::OperationMode, + const ::std::pair<const ::Ice::Byte*, const ::Ice::Byte*>&, ::std::vector< ::Ice::Byte>&); + bool ice_invoke(const ::std::string&, ::Ice::OperationMode, + const ::std::pair<const ::Ice::Byte*, const ::Ice::Byte*>&, ::std::vector< ::Ice::Byte>&, + const ::Ice::Context&); + void ice_invoke_async(const ::Ice::AMI_Object_ice_invokePtr&, const ::std::string&, ::Ice::OperationMode, + const ::std::vector< ::Ice::Byte>&); + void ice_invoke_async(const ::Ice::AMI_Object_ice_invokePtr&, const ::std::string&, ::Ice::OperationMode, + const ::std::vector< ::Ice::Byte>&, const ::Ice::Context&); + void ice_invoke_async(const ::Ice::AMI_Object_ice_invokePtr&, const ::std::string&, ::Ice::OperationMode, + const ::std::pair<const ::Ice::Byte*, const ::Ice::Byte*>&); + void ice_invoke_async(const ::Ice::AMI_Object_ice_invokePtr&, const ::std::string&, ::Ice::OperationMode, + const ::std::pair<const ::Ice::Byte*, const ::Ice::Byte*>&, const ::Ice::Context&); ::Ice::Identity ice_getIdentity() const; ::Ice::ObjectPrx ice_newIdentity(const ::Ice::Identity&) const; @@ -195,7 +204,8 @@ public: virtual void ice_ping(const ::Ice::Context&) = 0; virtual ::std::vector< ::std::string> ice_ids(const ::Ice::Context&) = 0; virtual ::std::string ice_id(const ::Ice::Context&) = 0; - virtual bool ice_invoke(const ::std::string&, ::Ice::OperationMode, const ::std::vector< ::Ice::Byte>&, + virtual bool ice_invoke(const ::std::string&, ::Ice::OperationMode, + const ::std::pair<const ::Ice::Byte*, const ::Ice::Byte*>&, ::std::vector< ::Ice::Byte>&, const ::Ice::Context&) = 0; virtual ::Ice::ConnectionIPtr __getConnection(bool&) const = 0; @@ -216,7 +226,8 @@ public: virtual void ice_ping(const ::Ice::Context&); virtual ::std::vector< ::std::string> ice_ids(const ::Ice::Context&); virtual ::std::string ice_id(const ::Ice::Context&); - virtual bool ice_invoke(const ::std::string&, ::Ice::OperationMode, const ::std::vector< ::Ice::Byte>&, + virtual bool ice_invoke(const ::std::string&, ::Ice::OperationMode, + const ::std::pair<const ::Ice::Byte*, const ::Ice::Byte*>&, ::std::vector< ::Ice::Byte>&, const ::Ice::Context&); virtual ::Ice::ConnectionIPtr __getConnection(bool&) const; @@ -248,7 +259,8 @@ public: virtual void ice_ping(const ::Ice::Context&); virtual ::std::vector< ::std::string> ice_ids(const ::Ice::Context&); virtual ::std::string ice_id(const ::Ice::Context&); - virtual bool ice_invoke(const ::std::string&, ::Ice::OperationMode, const ::std::vector< ::Ice::Byte>&, + virtual bool ice_invoke(const ::std::string&, ::Ice::OperationMode, + const ::std::pair<const ::Ice::Byte*, const ::Ice::Byte*>&, ::std::vector< ::Ice::Byte>&, const ::Ice::Context&); virtual ::Ice::ConnectionIPtr __getConnection(bool&) const; diff --git a/cpp/src/Glacier2/Blobject.cpp b/cpp/src/Glacier2/Blobject.cpp index af5e30c2c21..044ab52f9d5 100644 --- a/cpp/src/Glacier2/Blobject.cpp +++ b/cpp/src/Glacier2/Blobject.cpp @@ -101,8 +101,8 @@ Glacier2::Blobject::destroy() } void -Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Object_ice_invokePtr& amdCB, const ByteSeq& inParams, - const Current& current) +Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Object_ice_invokePtr& amdCB, + const std::pair<const Ice::Byte*, const Ice::Byte*>& inParams, const Current& current) { // // Set the correct facet on the proxy. diff --git a/cpp/src/Glacier2/Blobject.h b/cpp/src/Glacier2/Blobject.h index b026bafd52f..adf9cd086da 100644 --- a/cpp/src/Glacier2/Blobject.h +++ b/cpp/src/Glacier2/Blobject.h @@ -16,7 +16,7 @@ namespace Glacier2 { -class Blobject : public Ice::BlobjectAsync +class Blobject : public Ice::BlobjectArrayAsync { public: @@ -27,7 +27,8 @@ public: protected: - void invoke(Ice::ObjectPrx&, const Ice::AMD_Object_ice_invokePtr&, const Ice::ByteSeq&, const Ice::Current&); + void invoke(Ice::ObjectPrx&, const Ice::AMD_Object_ice_invokePtr&, + const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&); const Ice::CommunicatorPtr _communicator; const Ice::PropertiesPtr _properties; diff --git a/cpp/src/Glacier2/ClientBlobject.cpp b/cpp/src/Glacier2/ClientBlobject.cpp index 4f1c851b4bd..d02864882ac 100644 --- a/cpp/src/Glacier2/ClientBlobject.cpp +++ b/cpp/src/Glacier2/ClientBlobject.cpp @@ -38,7 +38,8 @@ Glacier2::ClientBlobject::destroy() } void -Glacier2::ClientBlobject::ice_invoke_async(const Ice::AMD_Object_ice_invokePtr& amdCB, const ByteSeq& inParams, +Glacier2::ClientBlobject::ice_invoke_async(const Ice::AMD_Object_ice_invokePtr& amdCB, + const std::pair<const Byte*, const Byte*>& inParams, const Current& current) { assert(_routingTable); // Destroyed? diff --git a/cpp/src/Glacier2/ClientBlobject.h b/cpp/src/Glacier2/ClientBlobject.h index 322f336c4b6..d4afcdc5f71 100644 --- a/cpp/src/Glacier2/ClientBlobject.h +++ b/cpp/src/Glacier2/ClientBlobject.h @@ -28,7 +28,8 @@ public: virtual void destroy(); - virtual void ice_invoke_async(const Ice::AMD_Object_ice_invokePtr&, const Ice::ByteSeq&, const Ice::Current&); + virtual void ice_invoke_async(const Ice::AMD_Object_ice_invokePtr&, + const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&); private: diff --git a/cpp/src/Glacier2/RequestQueue.cpp b/cpp/src/Glacier2/RequestQueue.cpp index 6ed5d3fe9f6..91d25c1d40a 100644 --- a/cpp/src/Glacier2/RequestQueue.cpp +++ b/cpp/src/Glacier2/RequestQueue.cpp @@ -46,10 +46,10 @@ private: } -Glacier2::Request::Request(const ObjectPrx& proxy, const ByteSeq& inParams, const Current& current, - bool forwardContext, const AMD_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) : _proxy(proxy), - _inParams(inParams), + _inParams(inParams.first, inParams.second), _current(current), _forwardContext(forwardContext), _amdCB(amdCB) diff --git a/cpp/src/Glacier2/RequestQueue.h b/cpp/src/Glacier2/RequestQueue.h index 9911592c522..c619100d19a 100644 --- a/cpp/src/Glacier2/RequestQueue.h +++ b/cpp/src/Glacier2/RequestQueue.h @@ -24,7 +24,7 @@ class Request : public IceUtil::Shared { public: - Request(const Ice::ObjectPrx&, const Ice::ByteSeq&, const Ice::Current&, bool, + Request(const Ice::ObjectPrx&, const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&, bool, const Ice::AMD_Object_ice_invokePtr&); void invoke(); diff --git a/cpp/src/Glacier2/ServerBlobject.cpp b/cpp/src/Glacier2/ServerBlobject.cpp index ee57fcba7bb..39cde8f084a 100644 --- a/cpp/src/Glacier2/ServerBlobject.cpp +++ b/cpp/src/Glacier2/ServerBlobject.cpp @@ -34,7 +34,8 @@ Glacier2::ServerBlobject::destroy() } void -Glacier2::ServerBlobject::ice_invoke_async(const Ice::AMD_Object_ice_invokePtr& amdCB, const ByteSeq& inParams, +Glacier2::ServerBlobject::ice_invoke_async(const Ice::AMD_Object_ice_invokePtr& amdCB, + const std::pair<const Byte*, const Byte*>& inParams, const Current& current) { assert(_connection); // Destroyed? diff --git a/cpp/src/Glacier2/ServerBlobject.h b/cpp/src/Glacier2/ServerBlobject.h index 99559365265..3f8e175a4af 100644 --- a/cpp/src/Glacier2/ServerBlobject.h +++ b/cpp/src/Glacier2/ServerBlobject.h @@ -27,7 +27,8 @@ public: virtual void destroy(); - virtual void ice_invoke_async(const Ice::AMD_Object_ice_invokePtr&, const Ice::ByteSeq&, const Ice::Current&); + virtual void ice_invoke_async(const Ice::AMD_Object_ice_invokePtr&, + const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&); private: diff --git a/cpp/src/Ice/Object.cpp b/cpp/src/Ice/Object.cpp index f07dddce0ad..0b5ce8a9ff2 100644 --- a/cpp/src/Ice/Object.cpp +++ b/cpp/src/Ice/Object.cpp @@ -299,6 +299,26 @@ Ice::Blobject::__dispatch(Incoming& in, const Current& current) } DispatchStatus +Ice::BlobjectArray::__dispatch(Incoming& in, const Current& current) +{ + pair<const Byte*, const Byte*> inParams; + vector<Byte> outParams; + Int sz = in.is()->getReadEncapsSize(); + in.is()->readBlob(inParams.first, sz); + inParams.second = inParams.first + sz; + bool ok = ice_invoke(inParams, outParams, current); + in.os()->writeBlob(outParams); + if(ok) + { + return DispatchOK; + } + else + { + return DispatchUserException; + } +} + +DispatchStatus Ice::BlobjectAsync::__dispatch(Incoming& in, const Current& current) { vector<Byte> inParams; @@ -324,6 +344,32 @@ Ice::BlobjectAsync::__dispatch(Incoming& in, const Current& current) return DispatchAsync; } +DispatchStatus +Ice::BlobjectArrayAsync::__dispatch(Incoming& in, const Current& current) +{ + pair<const Byte*, const Byte*> inParams; + Int sz = in.is()->getReadEncapsSize(); + in.is()->readBlob(inParams.first, sz); + inParams.second = inParams.first + sz; + AMD_Object_ice_invokePtr cb = new ::IceAsync::Ice::AMD_Object_ice_invoke(in); + try + { + ice_invoke_async(cb, inParams, current); + } + catch(const Exception& ex) + { + cb->ice_exception(ex); + } + catch(const ::std::exception& ex) + { + cb->ice_exception(ex); + } + catch(...) + { + cb->ice_exception(); + } + return DispatchAsync; +} void Ice::ice_writeObject(const OutputStreamPtr& out, const ObjectPtr& p) { diff --git a/cpp/src/Ice/OutgoingAsync.cpp b/cpp/src/Ice/OutgoingAsync.cpp index fef41fa0b86..784cc6ca356 100644 --- a/cpp/src/Ice/OutgoingAsync.cpp +++ b/cpp/src/Ice/OutgoingAsync.cpp @@ -417,12 +417,12 @@ IceInternal::OutgoingAsync::cleanup() void Ice::AMI_Object_ice_invoke::__invoke(const ObjectPrx& prx, const string& operation, OperationMode mode, - const vector<Byte>& inParams, const Context& context) + const pair<const Byte*, const Byte*>& inParams, const Context& context) { try { __prepare(prx, operation, mode, context); - __os->writeBlob(inParams); + __os->writeBlob(inParams.first, static_cast<Int>(inParams.second - inParams.first)); __os->endWriteEncaps(); } catch(const LocalException& ex) diff --git a/cpp/src/Ice/Proxy.cpp b/cpp/src/Ice/Proxy.cpp index 253f5909657..37951c6a898 100644 --- a/cpp/src/Ice/Proxy.cpp +++ b/cpp/src/Ice/Proxy.cpp @@ -277,6 +277,35 @@ IceProxy::Ice::Object::ice_invoke(const string& operation, vector<Byte>& outParams, const Context& context) { + 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(); + } + return ice_invoke(operation, mode, inPair, outParams, context); +} + +bool +IceProxy::Ice::Object::ice_invoke(const string& operation, + OperationMode mode, + const pair<const Byte*, const Byte*>& inParams, + vector<Byte>& outParams) +{ + return ice_invoke(operation, mode, inParams, outParams, _reference->getContext()); +} + +bool +IceProxy::Ice::Object::ice_invoke(const string& operation, + OperationMode mode, + const pair<const Byte*, const Byte*>& inParams, + vector<Byte>& outParams, + const Context& context) +{ int __cnt = 0; while(true) { @@ -320,6 +349,35 @@ IceProxy::Ice::Object::ice_invoke_async(const AMI_Object_ice_invokePtr& cb, const vector<Byte>& inParams, const Context& context) { + 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(); + } + ice_invoke_async(cb, operation, mode, inPair, context); +} + +void +IceProxy::Ice::Object::ice_invoke_async(const AMI_Object_ice_invokePtr& cb, + const string& operation, + OperationMode mode, + const pair<const Byte*, const Byte*>& inParams) +{ + ice_invoke_async(cb, operation, mode, inParams, _reference->getContext()); +} + +void +IceProxy::Ice::Object::ice_invoke_async(const AMI_Object_ice_invokePtr& cb, + const string& operation, + OperationMode mode, + const pair<const Byte*, const Byte*>& inParams, + const Context& context) +{ cb->__invoke(this, operation, mode, inParams, context); } @@ -1114,7 +1172,7 @@ IceDelegateM::Ice::Object::ice_id(const Context& __context) bool IceDelegateM::Ice::Object::ice_invoke(const string& operation, OperationMode mode, - const vector<Byte>& inParams, + const pair<const Byte*, const Byte*>& inParams, vector<Byte>& outParams, const Context& context) { @@ -1122,7 +1180,7 @@ IceDelegateM::Ice::Object::ice_invoke(const string& operation, try { BasicStream* __os = __og.os(); - __os->writeBlob(inParams); + __os->writeBlob(inParams.first, static_cast<Int>(inParams.second - inParams.first)); } catch(const ::Ice::LocalException& __ex) { @@ -1243,7 +1301,7 @@ IceDelegateD::Ice::Object::ice_id(const ::Ice::Context& __context) bool IceDelegateD::Ice::Object::ice_invoke(const string&, OperationMode, - const vector<Byte>&, + const pair<const Byte*, const Byte*>& inParams, vector<Byte>&, const Context&) { diff --git a/cpp/src/IceStorm/TopicI.cpp b/cpp/src/IceStorm/TopicI.cpp index dbc2cf505a4..6b2f87898ca 100644 --- a/cpp/src/IceStorm/TopicI.cpp +++ b/cpp/src/IceStorm/TopicI.cpp @@ -25,7 +25,7 @@ namespace IceStorm // The servant has a 1-1 association with a topic. It is used to // receive events from Publishers. // -class PublisherProxyI : public Ice::Blobject +class PublisherProxyI : public Ice::BlobjectArray { public: @@ -38,7 +38,7 @@ public: { } - virtual bool ice_invoke(const vector< Ice::Byte>&, vector< Ice::Byte>&, const Ice::Current&); + virtual bool ice_invoke(const pair<const Ice::Byte*, const Ice::Byte*>&, vector< Ice::Byte>&, const Ice::Current&); private: @@ -250,7 +250,7 @@ IceStorm::TopicSubscribers::clearErrorList() // Incoming events from publishers. // bool -PublisherProxyI::ice_invoke(const vector< Ice::Byte>& inParams, vector< Ice::Byte>& outParam, +PublisherProxyI::ice_invoke(const pair<const Ice::Byte*, const Ice::Byte*>& inParams, vector< Ice::Byte>& outParam, const Ice::Current& current) { const Ice::Context& context = current.ctx; @@ -268,7 +268,7 @@ PublisherProxyI::ice_invoke(const vector< Ice::Byte>& inParams, vector< Ice::Byt } event->op = current.operation; event->mode = current.mode; - event->data = inParams; + vector<Ice::Byte>(inParams.first, inParams.second).swap(event->data); event->context = context; _subscribers->publish(event); |