diff options
author | Michi Henning <michi@zeroc.com> | 2007-10-29 16:57:02 +1000 |
---|---|---|
committer | Michi Henning <michi@zeroc.com> | 2007-10-29 16:57:02 +1000 |
commit | 3d0c83b386b37331de7069430049aec4944451c9 (patch) | |
tree | 4fb024d1b638e88c63ba655c6d4348211e588b59 /cpp/src | |
parent | Merge branch 'master' of cvs:/home/git/ice (diff) | |
download | ice-3d0c83b386b37331de7069430049aec4944451c9.tar.bz2 ice-3d0c83b386b37331de7069430049aec4944451c9.tar.xz ice-3d0c83b386b37331de7069430049aec4944451c9.zip |
Bug 2522.
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/Incoming.cpp | 83 | ||||
-rw-r--r-- | cpp/src/Ice/IncomingAsync.cpp | 26 |
2 files changed, 90 insertions, 19 deletions
diff --git a/cpp/src/Ice/Incoming.cpp b/cpp/src/Ice/Incoming.cpp index 391515df1ad..07af1086aa8 100644 --- a/cpp/src/Ice/Incoming.cpp +++ b/cpp/src/Ice/Incoming.cpp @@ -406,6 +406,7 @@ IceInternal::Incoming::invoke(const ServantManagerPtr& servantManager) try { + bool finishedException = false; try { if(servantManager) @@ -420,27 +421,38 @@ IceInternal::Incoming::invoke(const ServantManagerPtr& servantManager) } if(_locator) { - _servant = _locator->locate(_current, _cookie); + try + { + _servant = _locator->locate(_current, _cookie); + } + catch(const UserException& ex) + { + _os.write(ex); + replyStatus = replyUserException; + } } } } - if(!_servant) + if(replyStatus == replyOK) { - if(servantManager && servantManager->hasServant(_current.id)) + if(!_servant) { - replyStatus = replyFacetNotExist; + if(servantManager && servantManager->hasServant(_current.id)) + { + replyStatus = replyFacetNotExist; + } + else + { + replyStatus = replyObjectNotExist; + } } else { - replyStatus = replyObjectNotExist; - } - } - else - { - dispatchStatus = _servant->__dispatch(*this, _current); - if(dispatchStatus == DispatchUserException) - { - replyStatus = replyUserException; + dispatchStatus = _servant->__dispatch(*this, _current); + if(dispatchStatus == DispatchUserException) + { + replyStatus = replyUserException; + } } } } @@ -448,15 +460,50 @@ IceInternal::Incoming::invoke(const ServantManagerPtr& servantManager) { if(_locator && _servant && dispatchStatus != DispatchAsync) { - _locator->finished(_current, _servant, _cookie); + try + { + _locator->finished(_current, _servant, _cookie); + } + catch(const UserException& ex) + { + // + // The operation may have already marshaled a reply; we must overwrite that reply. + // + _os.endWriteEncaps(); + _os.b.resize(headerSize + 5); // Byte following reply status. + _os.startWriteEncaps(); + _os.write(ex); + replyStatus = replyUserException; // Code below inserts the reply status. + finishedException = true; + } + catch(...) + { + throw; + } + } + if(!finishedException) + { + throw; } - - throw; } - if(_locator && _servant && dispatchStatus != DispatchAsync) + if(!finishedException && _locator && _servant && dispatchStatus != DispatchAsync) { - _locator->finished(_current, _servant, _cookie); + try + { + _locator->finished(_current, _servant, _cookie); + } + catch(const UserException& ex) + { + // + // The operation may have already marshaled a reply; we must overwrite that reply. + // + _os.endWriteEncaps(); + _os.b.resize(headerSize + 5); // Byte following reply status. + _os.startWriteEncaps(); + _os.write(ex); + replyStatus = replyUserException; // Code below inserts the reply status. + } } } catch(const std::exception& ex) diff --git a/cpp/src/Ice/IncomingAsync.cpp b/cpp/src/Ice/IncomingAsync.cpp index 0db1a4acaf6..c479c034399 100644 --- a/cpp/src/Ice/IncomingAsync.cpp +++ b/cpp/src/Ice/IncomingAsync.cpp @@ -138,7 +138,31 @@ IceInternal::IncomingAsync::__servantLocatorFinished() { if(_locator && _servant) { - _locator->finished(_current, _servant, _cookie); + try + { + _locator->finished(_current, _servant, _cookie); + } + catch(const UserException& ex) + { + // + // The operation may have already marshaled a reply; we must overwrite that reply. + // + if(_response) + { + _os.endWriteEncaps(); + _os.b.resize(headerSize + 4); // Reply status position. + _os.write(replyUserException); + _os.startWriteEncaps(); + _os.write(ex); + _os.endWriteEncaps(); + _connection->sendResponse(&_os, _compress); + } + else + { + _connection->sendNoResponse(); + } + return false; + } } return true; } |