summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorMarc Laukien <marc@zeroc.com>2001-11-29 20:59:01 +0000
committerMarc Laukien <marc@zeroc.com>2001-11-29 20:59:01 +0000
commit24f0596311d7c1d22c032505f13da24fbf5d5ad1 (patch)
treebe28204ca3861f9accd3fb4b1051c8fb03cb02fc /cpp
parentinitial check-in (diff)
downloadice-24f0596311d7c1d22c032505f13da24fbf5d5ad1.tar.bz2
ice-24f0596311d7c1d22c032505f13da24fbf5d5ad1.tar.xz
ice-24f0596311d7c1d22c032505f13da24fbf5d5ad1.zip
ice_invoke
Diffstat (limited to 'cpp')
-rw-r--r--cpp/include/Ice/Object.h2
-rw-r--r--cpp/include/Ice/Proxy.h13
-rw-r--r--cpp/src/Ice/.depend4
-rw-r--r--cpp/src/Ice/Incoming.cpp72
-rw-r--r--cpp/src/Ice/Object.cpp8
-rw-r--r--cpp/src/Ice/Outgoing.cpp19
-rw-r--r--cpp/src/Ice/Proxy.cpp35
-rw-r--r--cpp/src/IceStorm/Subscriber.cpp3
-rw-r--r--cpp/src/IceStorm/TopicI.cpp6
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,