summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/Incoming.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Ice/Incoming.cpp')
-rw-r--r--cpp/src/Ice/Incoming.cpp72
1 files changed, 48 insertions, 24 deletions
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__);
}
}