diff options
Diffstat (limited to 'cpp/src/Ice/Incoming.cpp')
-rw-r--r-- | cpp/src/Ice/Incoming.cpp | 72 |
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__); } } |