diff options
Diffstat (limited to 'cpp/test/Ice/interceptor/AMDInterceptorI.cpp')
-rw-r--r-- | cpp/test/Ice/interceptor/AMDInterceptorI.cpp | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/cpp/test/Ice/interceptor/AMDInterceptorI.cpp b/cpp/test/Ice/interceptor/AMDInterceptorI.cpp new file mode 100644 index 00000000000..5387f799bdc --- /dev/null +++ b/cpp/test/Ice/interceptor/AMDInterceptorI.cpp @@ -0,0 +1,154 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#include <AMDInterceptorI.h> +#include <Test.h> +#include <TestCommon.h> + +AMDInterceptorI::AMDInterceptorI(const Ice::ObjectPtr& servant) : + InterceptorI(servant), + _defaultCb(new DispatchInterceptorAsyncCallbackI(*this)), + _actualStatus(IceInternal::DispatchAsync) + +{ +} + + +IceInternal::DispatchStatus +AMDInterceptorI::dispatch(Ice::Request& request) +{ + class CallbackI : public Ice::DispatchInterceptorAsyncCallback + { + public: + + CallbackI(AMDInterceptorI& interceptor) : + _interceptor(interceptor) + { + } + + virtual bool response(bool ok) + { + test(ok); + return false; + } + + virtual bool exception(const std::exception& ex) + { + test(dynamic_cast<const Test::RetryException*>(&ex) != 0); + return false; + } + + virtual bool exception() + { + // + // Unexpected + // + test(false); + return false; + } + + private: + + AMDInterceptorI& _interceptor; + }; + + + Ice::Current& current = const_cast<Ice::Current&>(request.getCurrent()); + _lastOperation = current.operation; + + Ice::DispatchInterceptorAsyncCallbackPtr cb = new CallbackI(*this); + + if(_lastOperation == "amdAddWithRetry") + { + for(int i = 0; i < 10; ++i) + { + _lastStatus = _servant->ice_dispatch(request, cb); + test(_lastStatus == IceInternal::DispatchAsync); + } + + current.ctx["retry"] = "no"; + } + + _lastStatus = _servant->ice_dispatch(request, _defaultCb); + return _lastStatus; +} + +void +AMDInterceptorI::setActualStatus(IceInternal::DispatchStatus status) +{ + IceUtil::Mutex::Lock lock(_mutex); + _actualStatus = status; +} + +void +AMDInterceptorI::setActualStatus(const IceUtil::Exception& e) +{ + IceUtil::Mutex::Lock lock(_mutex); + _exception.reset(e.ice_clone()); + _actualStatus = IceInternal::DispatchAsync; +} + +IceInternal::DispatchStatus +AMDInterceptorI::getActualStatus() const +{ + IceUtil::Mutex::Lock lock(_mutex); + return _actualStatus; +} + +IceUtil::Exception* +AMDInterceptorI::getException() const +{ + IceUtil::Mutex::Lock lock(_mutex); + return _exception.get(); +} + +void +AMDInterceptorI::clear() +{ + InterceptorI::clear(); + IceUtil::Mutex::Lock lock(_mutex); + _actualStatus = IceInternal::DispatchAsync; + _exception.reset(); +} + + +DispatchInterceptorAsyncCallbackI::DispatchInterceptorAsyncCallbackI(AMDInterceptorI& interceptor) : + _interceptor(interceptor) +{ +} + +bool +DispatchInterceptorAsyncCallbackI::response(bool ok) +{ + _interceptor.setActualStatus(ok ? IceInternal::DispatchOK : IceInternal::DispatchUserException); + return true; +} + + +bool +DispatchInterceptorAsyncCallbackI::exception(const std::exception& ex) +{ + // + // Only Ice exceptions are raised by this test + // + const IceUtil::Exception& ue = dynamic_cast<const IceUtil::Exception&>(ex); + _interceptor.setActualStatus(ue); + return true; + +} + +bool +DispatchInterceptorAsyncCallbackI::exception() +{ + // + // Unexpected + // + test(false); + return true; +} |