diff options
author | Marc Laukien <marc@zeroc.com> | 2001-11-29 20:59:01 +0000 |
---|---|---|
committer | Marc Laukien <marc@zeroc.com> | 2001-11-29 20:59:01 +0000 |
commit | 24f0596311d7c1d22c032505f13da24fbf5d5ad1 (patch) | |
tree | be28204ca3861f9accd3fb4b1051c8fb03cb02fc /cpp | |
parent | initial check-in (diff) | |
download | ice-24f0596311d7c1d22c032505f13da24fbf5d5ad1.tar.bz2 ice-24f0596311d7c1d22c032505f13da24fbf5d5ad1.tar.xz ice-24f0596311d7c1d22c032505f13da24fbf5d5ad1.zip |
ice_invoke
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/include/Ice/Object.h | 2 | ||||
-rw-r--r-- | cpp/include/Ice/Proxy.h | 13 | ||||
-rw-r--r-- | cpp/src/Ice/.depend | 4 | ||||
-rw-r--r-- | cpp/src/Ice/Incoming.cpp | 72 | ||||
-rw-r--r-- | cpp/src/Ice/Object.cpp | 8 | ||||
-rw-r--r-- | cpp/src/Ice/Outgoing.cpp | 19 | ||||
-rw-r--r-- | cpp/src/Ice/Proxy.cpp | 35 | ||||
-rw-r--r-- | cpp/src/IceStorm/Subscriber.cpp | 3 | ||||
-rw-r--r-- | cpp/src/IceStorm/TopicI.cpp | 6 |
9 files changed, 109 insertions, 53 deletions
diff --git a/cpp/include/Ice/Object.h b/cpp/include/Ice/Object.h index 56791a2e4f4..6918025e716 100644 --- a/cpp/include/Ice/Object.h +++ b/cpp/include/Ice/Object.h @@ -97,7 +97,7 @@ class ICE_API Blobject : virtual public Object { public: - virtual void ice_invokeIn(const std::vector<Byte>&, const Current&) = 0; + virtual void ice_invoke(const std::vector<Byte>&, std::vector<Byte>&, const Current&) = 0; virtual ::IceInternal::DispatchStatus __dispatch(::IceInternal::Incoming&, const Current&); }; diff --git a/cpp/include/Ice/Proxy.h b/cpp/include/Ice/Proxy.h index 78500585adc..cb454cf20d0 100644 --- a/cpp/include/Ice/Proxy.h +++ b/cpp/include/Ice/Proxy.h @@ -41,8 +41,8 @@ public: bool ice_isA(const std::string&, const ::Ice::Context& = ::Ice::Context()); void ice_ping(const ::Ice::Context& = ::Ice::Context()); - void ice_invokeIn(const std::string&, bool, const std::vector< ::Ice::Byte>&, - const ::Ice::Context& = ::Ice::Context()); + void ice_invoke(const std::string&, bool, const std::vector< ::Ice::Byte>&, std::vector< ::Ice::Byte>&, + const ::Ice::Context& = ::Ice::Context()); std::string ice_getIdentity() const; ::Ice::ObjectPrx ice_newIdentity(const std::string&) const; @@ -92,7 +92,8 @@ public: virtual bool ice_isA(const std::string&, const ::Ice::Context&) = 0; virtual void ice_ping(const ::Ice::Context&) = 0; - virtual void ice_invokeIn(const std::string&, const std::vector< ::Ice::Byte>&, const ::Ice::Context&) = 0; + virtual void ice_invoke(const std::string&, const std::vector< ::Ice::Byte>&, std::vector< ::Ice::Byte>&, + const ::Ice::Context&) = 0; virtual void ice_flush() = 0; }; @@ -107,7 +108,8 @@ public: virtual bool ice_isA(const std::string&, const ::Ice::Context&); virtual void ice_ping(const ::Ice::Context&); - virtual void ice_invokeIn(const std::string&, const std::vector< ::Ice::Byte>&, const ::Ice::Context&); + virtual void ice_invoke(const std::string&, const std::vector< ::Ice::Byte>&, std::vector< ::Ice::Byte>&, + const ::Ice::Context&); virtual void ice_flush(); protected: @@ -132,7 +134,8 @@ public: virtual bool ice_isA(const std::string&, const ::Ice::Context&); virtual void ice_ping(const ::Ice::Context&); - virtual void ice_invokeIn(const std::string&, const std::vector< ::Ice::Byte>&, const ::Ice::Context&); + virtual void ice_invoke(const std::string&, const std::vector< ::Ice::Byte>&, std::vector< ::Ice::Byte>&, + const ::Ice::Context&); virtual void ice_flush(); protected: diff --git a/cpp/src/Ice/.depend b/cpp/src/Ice/.depend index 320ecf3bbb6..a576fe295fd 100644 --- a/cpp/src/Ice/.depend +++ b/cpp/src/Ice/.depend @@ -29,10 +29,10 @@ LocalObject.o: LocalObject.cpp ../../include/Ice/LocalObject.h ../../include/Ice Object.o: Object.cpp ../../include/Ice/Object.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Incoming.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObject.h ../../include/Ice/InstanceF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Current.h ProxyFactory.o: ProxyFactory.cpp ../Ice/ProxyFactory.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/InstanceF.h ../../include/Ice/ReferenceF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../Ice/Instance.h ../../include/Ice/CommunicatorF.h ../../include/Ice/ObjectF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObject.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/ThreadPoolF.h ../../include/Ice/EmitterF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/Proxy.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Current.h ../Ice/Reference.h ../Ice/EndpointF.h ../Ice/Endpoint.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h Proxy.o: Proxy.cpp ../../include/Ice/Proxy.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/Handle.h ../../include/Ice/EmitterF.h ../../include/Ice/ObjectF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObject.h ../../include/Ice/ReferenceF.h ../../include/Ice/Current.h ../../include/Ice/Object.h ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/CommunicatorF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/CollectorF.h ../Ice/EndpointF.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Direct.h ../Ice/Reference.h ../Ice/Endpoint.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/Instance.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/ThreadPoolF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/Logger.h ../Ice/TraceLevels.h ../Ice/Emitter.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/SecurityException.h -Outgoing.o: Outgoing.cpp ../../include/Ice/Outgoing.h ../../include/Ice/EmitterF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ReferenceF.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Buffer.h ../../include/Ice/Object.h ../../include/IceUtil/Shared.h ../Ice/Emitter.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/ThreadPoolF.h ../Ice/EndpointF.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObject.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/Reference.h +Outgoing.o: Outgoing.cpp ../../include/Ice/Outgoing.h ../../include/Ice/EmitterF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ReferenceF.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Buffer.h ../../include/Ice/Current.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/Object.h ../Ice/Emitter.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/ThreadPoolF.h ../Ice/EndpointF.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/Reference.h Incoming.o: Incoming.cpp ../../include/Ice/Incoming.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/InstanceF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/CommunicatorF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantLocator.h ../../include/Ice/Current.h ../../include/Ice/Object.h Direct.o: Direct.cpp ../../include/Ice/Direct.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ReferenceF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/CommunicatorF.h ../../include/Ice/ServantLocator.h ../Ice/Reference.h ../Ice/EndpointF.h ../../include/Ice/InstanceF.h ../../include/Ice/Object.h -Emitter.o: Emitter.cpp ../Ice/Emitter.h ../../include/Ice/EmitterF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/ThreadPoolF.h ../Ice/EndpointF.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../Ice/Instance.h ../../include/Ice/CommunicatorF.h ../../include/Ice/PropertiesF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/Logger.h ../Ice/TraceLevels.h ../Ice/TraceUtil.h ../Ice/Transceiver.h ../Ice/Connector.h ../Ice/ThreadPool.h ../Ice/Endpoint.h ../Ice/AcceptorF.h ../../include/Ice/Outgoing.h ../../include/Ice/ReferenceF.h ../Ice/Protocol.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/SecurityException.h +Emitter.o: Emitter.cpp ../Ice/Emitter.h ../../include/Ice/EmitterF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/ThreadPoolF.h ../Ice/EndpointF.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../Ice/Instance.h ../../include/Ice/CommunicatorF.h ../../include/Ice/PropertiesF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/Logger.h ../Ice/TraceLevels.h ../Ice/TraceUtil.h ../Ice/Transceiver.h ../Ice/Connector.h ../Ice/ThreadPool.h ../Ice/Endpoint.h ../Ice/AcceptorF.h ../../include/Ice/Outgoing.h ../../include/Ice/ReferenceF.h ../../include/Ice/Current.h ../Ice/Protocol.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/SecurityException.h Collector.o: Collector.cpp ../Ice/Collector.h ../../include/Ice/CollectorF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../Ice/AcceptorF.h ../Ice/ThreadPoolF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../Ice/EndpointF.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../Ice/Instance.h ../../include/Ice/CommunicatorF.h ../../include/Ice/PropertiesF.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/EmitterF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/Logger.h ../../include/Ice/Properties.h ../Ice/TraceUtil.h ../Ice/Transceiver.h ../Ice/Acceptor.h ../Ice/ThreadPool.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../Ice/Endpoint.h ../Ice/ConnectorF.h ../../include/Ice/Incoming.h ../Ice/Protocol.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/SecurityException.h Network.o: Network.cpp ../Ice/Network.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/Ice/Exception.h ../../include/IceUtil/Exception.h ../../include/Ice/LocalException.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/IceUtil/Handle.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/Ice/LocalObjectF.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ThreadPool.o: ThreadPool.cpp ../Ice/ThreadPool.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../Ice/ThreadPoolF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/InstanceF.h ../Ice/EventHandlerF.h ../Ice/EventHandler.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Buffer.h ../Ice/Network.h ../../include/Ice/Exception.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObjectF.h ../../include/Ice/LocalObject.h ../Ice/Instance.h ../../include/Ice/CommunicatorF.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/EmitterF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/Properties.h ../../include/Ice/Logger.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../Ice/Protocol.h ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/CollectorF.h ../Ice/EndpointF.h diff --git a/cpp/src/Ice/Incoming.cpp b/cpp/src/Ice/Incoming.cpp index ac4bc545b14..c60efce2321 100644 --- a/cpp/src/Ice/Incoming.cpp +++ b/cpp/src/Ice/Incoming.cpp @@ -43,20 +43,24 @@ IceInternal::Incoming::invoke() } BasicStream::Container::size_type statusPos = _os.b.size(); + _os.write(static_cast<Byte>(0)); + + // + // Input and output parameters are always sent in an + // encapsulation, which makes it possible to forward oneway + // requests as blobs. + // + _is.startReadEncaps(); + _os.startWriteEncaps(); ObjectPtr servant; ServantLocatorPtr locator; LocalObjectPtr cookie; + try { - // - // Input parameters are always sent in an encapsulation, - // which makes it possible to forward oneway requests as - // blobs. - // - _is.startReadEncaps(); - servant = _adapter->identityToServant(current.identity); + DispatchStatus status; if (!servant) { @@ -80,9 +84,9 @@ IceInternal::Incoming::invoke() } } - if(!servant) + if (!servant) { - _os.write(static_cast<Byte>(DispatchObjectNotExist)); + status = DispatchObjectNotExist; } else { @@ -91,74 +95,94 @@ IceInternal::Incoming::invoke() ObjectPtr facetServant = servant->ice_findFacet(current.facet); if (!facetServant) { - _os.write(static_cast<Byte>(DispatchFacetNotExist)); + status = DispatchFacetNotExist; } else { - _os.write(static_cast<Byte>(DispatchOK)); - DispatchStatus status = facetServant->__dispatch(*this, current); - _is.checkReadEncaps(); - *(_os.b.begin() + statusPos) = static_cast<Byte>(status); + status = facetServant->__dispatch(*this, current); } } else { - _os.write(static_cast<Byte>(DispatchOK)); - DispatchStatus status = servant->__dispatch(*this, current); - _is.checkReadEncaps(); - *(_os.b.begin() + statusPos) = static_cast<Byte>(status); + status = servant->__dispatch(*this, current); } } - _is.endReadEncaps(); if (locator && servant) { locator->finished(_adapter, current, servant, cookie); } + + _is.endReadEncaps(); + _os.endWriteEncaps(); + + if (status != DispatchOK && status != DispatchUserException) + { + _os.b.resize(statusPos); + _os.write(static_cast<Byte>(status)); + } + else + { + *(_os.b.begin() + statusPos) = static_cast<Byte>(status); + } } catch (const LocationForward& ex) { - _is.endReadEncaps(); if (locator && servant) { locator->finished(_adapter, current, servant, cookie); } + + _is.endReadEncaps(); + _os.endWriteEncaps(); + _os.b.resize(statusPos); _os.write(static_cast<Byte>(DispatchLocationForward)); _os.write(ex._prx); - return; } catch (const LocalException& ex) { - _is.endReadEncaps(); if (locator && servant) { locator->finished(_adapter, current, servant, cookie); } + + _is.endReadEncaps(); + _os.endWriteEncaps(); + _os.b.resize(statusPos); _os.write(static_cast<Byte>(DispatchUnknownLocalException)); + ex.ice_throw(); } catch (const UserException& ex) { - _is.endReadEncaps(); if (locator && servant) { locator->finished(_adapter, current, servant, cookie); } + + _is.endReadEncaps(); + _os.endWriteEncaps(); + _os.b.resize(statusPos); _os.write(static_cast<Byte>(DispatchUnknownUserException)); + ex.ice_throw(); } catch (...) { - _is.endReadEncaps(); if (locator && servant) { locator->finished(_adapter, current, servant, cookie); } + + _is.endReadEncaps(); + _os.endWriteEncaps(); + _os.b.resize(statusPos); _os.write(static_cast<Byte>(DispatchUnknownException)); + throw UnknownException(__FILE__, __LINE__); } } diff --git a/cpp/src/Ice/Object.cpp b/cpp/src/Ice/Object.cpp index 6d1f28f91aa..63a8dfa5f29 100644 --- a/cpp/src/Ice/Object.cpp +++ b/cpp/src/Ice/Object.cpp @@ -248,9 +248,11 @@ Ice::Object::ice_findFacet(const string& name) DispatchStatus Ice::Blobject::__dispatch(Incoming& in, const Current& current) { - vector<Byte> blob; + vector<Byte> inParams; + vector<Byte> outParams; Int sz = in.is()->getReadEncapsSize(); - in.is()->readBlob(blob, sz); - ice_invokeIn(blob, current); + in.is()->readBlob(inParams, sz); + ice_invoke(inParams, outParams, current); + in.is()->writeBlob(outParams); return ::IceInternal::DispatchOK; } diff --git a/cpp/src/Ice/Outgoing.cpp b/cpp/src/Ice/Outgoing.cpp index 86eb35b0b1f..5400798f604 100644 --- a/cpp/src/Ice/Outgoing.cpp +++ b/cpp/src/Ice/Outgoing.cpp @@ -71,10 +71,11 @@ IceInternal::Outgoing::Outgoing(const EmitterPtr& emitter, const ReferencePtr& r _os.write(p->first); _os.write(p->second); } - + // - // Input parameters are always sent in an encapsulation, which - // makes it possible to forward oneway requests as blobs. + // Input and output parameters are always sent in an + // encapsulation, which makes it possible to forward oneway + // requests as blobs. // _os.startWriteEncaps(); } @@ -221,12 +222,24 @@ IceInternal::Outgoing::finished(BasicStream& is) { case DispatchOK: { + // + // Input and output parameters are always sent in an + // encapsulation, which makes it possible to forward + // oneway requests as blobs. + // + _is.startReadEncaps(); _state = StateOK; break; } case DispatchUserException: { + // + // Input and output parameters are always sent in an + // encapsulation, which makes it possible to forward + // oneway requests as blobs. + // + _is.startReadEncaps(); _state = StateException; break; } diff --git a/cpp/src/Ice/Proxy.cpp b/cpp/src/Ice/Proxy.cpp index 00f3f1a8173..d803cd8f8b8 100644 --- a/cpp/src/Ice/Proxy.cpp +++ b/cpp/src/Ice/Proxy.cpp @@ -151,8 +151,11 @@ IceProxy::Ice::Object::ice_ping(const Context& __context) } void -IceProxy::Ice::Object::ice_invokeIn(const string& operation, bool nonmutating, const vector<Byte>& inParams, - const Context& __context) +IceProxy::Ice::Object::ice_invoke(const string& operation, + bool nonmutating, + const vector<Byte>& inParams, + vector<Byte>& outParams, + const Context& __context) { int __cnt = 0; while (true) @@ -160,13 +163,17 @@ IceProxy::Ice::Object::ice_invokeIn(const string& operation, bool nonmutating, c try { Handle< ::IceDelegate::Ice::Object> __del = __getDelegate(); - __del->ice_invokeIn(operation, inParams, __context); + __del->ice_invoke(operation, inParams, outParams, __context); return; } +// For routers, we want to propagate location forwards to the caller. +// TODO: Should this be configurable? +/* catch (const LocationForward& __ex) { __locationForward(__ex); } +*/ catch (const NonRepeatable& __ex) { if (nonmutating) @@ -533,15 +540,20 @@ IceDelegateM::Ice::Object::ice_ping(const Context& __context) } void -IceDelegateM::Ice::Object::ice_invokeIn(const string& operation, const vector<Byte>& inParams, - const Context& __context) +IceDelegateM::Ice::Object::ice_invoke(const string& operation, + const vector<Byte>& inParams, + vector<Byte>& outParams, + const Context& __context) { Outgoing __out(__emitter, __reference, operation.c_str(), __context); BasicStream* __os = __out.os(); __os->writeBlob(inParams); - if (!__out.invoke()) + __out.invoke(); + if (__reference->mode == Reference::ModeTwoway) { - throw ::Ice::UnknownUserException(__FILE__, __LINE__); + BasicStream* __is = __out.is(); + Int sz = __is->getReadEncapsSize(); + __is->readBlob(outParams, sz); } } @@ -653,8 +665,10 @@ IceDelegateD::Ice::Object::ice_ping(const ::Ice::Context& __context) } void -IceDelegateD::Ice::Object::ice_invokeIn(const string& operation, const vector<Byte>& inParams, - const ::Ice::Context& context) +IceDelegateD::Ice::Object::ice_invoke(const string& operation, + const vector<Byte>& inParams, + vector<Byte>& outParams, + const ::Ice::Context& context) { Current __current; __initCurrent(__current, operation, context); @@ -666,7 +680,7 @@ IceDelegateD::Ice::Object::ice_invokeIn(const string& operation, const vector<By } try { - __servant->ice_invokeIn(inParams, __current); + __servant->ice_invoke(inParams, outParams, __current); } catch (const LocalException&) { @@ -707,4 +721,3 @@ IceDelegateD::Ice::Object::setup(const ReferencePtr& ref, const ObjectAdapterPtr __reference = ref; __adapter = adapter; } - diff --git a/cpp/src/IceStorm/Subscriber.cpp b/cpp/src/IceStorm/Subscriber.cpp index 402d664da03..67bfb29b87f 100644 --- a/cpp/src/IceStorm/Subscriber.cpp +++ b/cpp/src/IceStorm/Subscriber.cpp @@ -127,7 +127,8 @@ Subscriber::publish(const string& op, const std::vector< ::Ice::Byte>& blob) try { bool nonmutating = true; - _obj->ice_invokeIn(op, nonmutating, blob); + std::vector< ::Ice::Byte> dummy; + _obj->ice_invoke(op, nonmutating, blob, dummy); } catch(const Ice::LocalException& e) { diff --git a/cpp/src/IceStorm/TopicI.cpp b/cpp/src/IceStorm/TopicI.cpp index 488872ea287..d1205710c6b 100644 --- a/cpp/src/IceStorm/TopicI.cpp +++ b/cpp/src/IceStorm/TopicI.cpp @@ -41,7 +41,7 @@ public: { } - virtual void ice_invokeIn(const vector< Ice::Byte>&, const Ice::Current&); + virtual void ice_invoke(const vector< Ice::Byte>&, vector< Ice::Byte>&, const Ice::Current&); private: @@ -175,9 +175,9 @@ private: } // End namespace IceStorm void -BlobjectI::ice_invokeIn(const vector< Ice::Byte>& blob, const Ice::Current& current) +BlobjectI::ice_invoke(const vector< Ice::Byte>& inParams, vector< Ice::Byte>& outParam, const Ice::Current& current) { - _subscribers->publish(current.operation, blob); + _subscribers->publish(current.operation, inParams); } TopicI::TopicI(const Ice::ObjectAdapterPtr& adapter, const TraceLevelsPtr& traceLevels, const Ice::LoggerPtr& logger, |