callbacki.cpp
来自「ICE-3.2 一个开源的中间件」· C++ 代码 · 共 364 行
CPP
364 行
// **********************************************************************//// 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 <Ice/Ice.h>#include <CallbackI.h>#include <TestCommon.h>using namespace std;using namespace Ice;using namespace Test;class AMI_CallbackReceiver_callbackI : public AMI_CallbackReceiver_callback{public: AMI_CallbackReceiver_callbackI(const AMD_Callback_initiateCallbackPtr cb) : _cb(cb) { } virtual void ice_response() { _cb->ice_response(); } virtual void ice_exception(const Exception& e) { _cb->ice_exception(e); }private: const AMD_Callback_initiateCallbackPtr _cb;};class AMI_CallbackReceiver_callbackExI : public AMI_CallbackReceiver_callbackEx{public: AMI_CallbackReceiver_callbackExI(const AMD_Callback_initiateCallbackExPtr cb) : _cb(cb) { } virtual void ice_response() { _cb->ice_response(); } virtual void ice_exception(const Exception& e) { _cb->ice_exception(e); }private: const AMD_Callback_initiateCallbackExPtr _cb;};class AMI_CallbackReceiver_concurrentCallbackI : public AMI_CallbackReceiver_concurrentCallback{public: AMI_CallbackReceiver_concurrentCallbackI(const AMD_Callback_initiateConcurrentCallbackPtr cb) : _cb(cb) { } virtual void ice_response(Int number) { _cb->ice_response(number); } virtual void ice_exception(const Exception& e) { _cb->ice_exception(e); }private: const AMD_Callback_initiateConcurrentCallbackPtr _cb;};class AMI_CallbackReceiver_waitCallbackI : public AMI_CallbackReceiver_waitCallback{public: AMI_CallbackReceiver_waitCallbackI(const AMD_Callback_initiateWaitCallbackPtr cb) : _cb(cb) { } virtual void ice_response() { _cb->ice_response(); } virtual void ice_exception(const Exception& e) { _cb->ice_exception(e); }private: const AMD_Callback_initiateWaitCallbackPtr _cb;};class AMI_CallbackReceiver_callbackWithPayloadI : public AMI_CallbackReceiver_callbackWithPayload{public: AMI_CallbackReceiver_callbackWithPayloadI(const AMD_Callback_initiateCallbackWithPayloadPtr cb) : _cb(cb) { } virtual void ice_response() { _cb->ice_response(); } virtual void ice_exception(const Exception& e) { _cb->ice_exception(e); }private: const AMD_Callback_initiateCallbackWithPayloadPtr _cb;};CallbackReceiverI::CallbackReceiverI() : _callback(false), _waitCallback(false), _callbackWithPayload(false), _finishWaitCallback(false){}voidCallbackReceiverI::callback(const Current&){ Lock sync(*this); assert(!_callback); _callback = true; notifyAll();}voidCallbackReceiverI::callbackEx(const Current& current){ callback(current); CallbackException ex; ex.someValue = 3.14; ex.someString = "3.14"; throw ex;}voidCallbackReceiverI::concurrentCallback_async(const AMD_CallbackReceiver_concurrentCallbackPtr& cb, Int number, const Current&){ Lock sync(*this); pair<AMD_CallbackReceiver_concurrentCallbackPtr, Int> p; p.first = cb; p.second = number; _callbacks.push_back(p); notifyAll();}voidCallbackReceiverI::waitCallback(const Current&){ { Lock sync(*this); assert(!_waitCallback); _waitCallback = true; notifyAll(); } { Lock sync(*this); while(!_finishWaitCallback) { test(timedWait(IceUtil::Time::milliSeconds(10000))); } _finishWaitCallback = false; }}voidCallbackReceiverI::callbackWithPayload(const Ice::ByteSeq&, const Current&){ Lock sync(*this); assert(!_callbackWithPayload); _callbackWithPayload = true; notifyAll();}boolCallbackReceiverI::callbackOK(){ Lock sync(*this); while(!_callback) { if(!timedWait(IceUtil::Time::milliSeconds(10000))) { return false; } } _callback = false; return true;}boolCallbackReceiverI::waitCallbackOK(){ Lock sync(*this); while(!_waitCallback) { if(!timedWait(IceUtil::Time::milliSeconds(10000))) { return false; } } _waitCallback = false; return true;}boolCallbackReceiverI::callbackWithPayloadOK(){ Lock sync(*this); while(!_callbackWithPayload) { if(!timedWait(IceUtil::Time::milliSeconds(10000))) { return false; } } _callbackWithPayload = false; return true;}voidCallbackReceiverI::notifyWaitCallback(){ Lock sync(*this); _finishWaitCallback = true; notifyAll();};boolCallbackReceiverI::answerConcurrentCallbacks(unsigned int num){ Lock sync(*this); while(_callbacks.size() != num) { if(!timedWait(IceUtil::Time::milliSeconds(10000))) { return false; } } for(vector<pair<AMD_CallbackReceiver_concurrentCallbackPtr, Int> >::const_iterator p = _callbacks.begin(); p != _callbacks.end(); ++p) { p->first->ice_response(p->second); } _callbacks.clear(); return true;}CallbackI::CallbackI(){}voidCallbackI::initiateCallback_async(const AMD_Callback_initiateCallbackPtr& cb, const CallbackReceiverPrx& proxy, const Current& current){ if(proxy->ice_isTwoway()) { proxy->callback_async(new AMI_CallbackReceiver_callbackI(cb), current.ctx); } else { proxy->callback(current.ctx); cb->ice_response(); }}voidCallbackI::initiateCallbackEx_async(const AMD_Callback_initiateCallbackExPtr& cb, const CallbackReceiverPrx& proxy, const Current& current){ if(proxy->ice_isTwoway()) { proxy->callbackEx_async(new AMI_CallbackReceiver_callbackExI(cb), current.ctx); } else { proxy->callbackEx(current.ctx); cb->ice_response(); }}voidCallbackI::initiateConcurrentCallback_async(const AMD_Callback_initiateConcurrentCallbackPtr& cb, Int number, const CallbackReceiverPrx& proxy, const Current& current){ proxy->concurrentCallback_async(new AMI_CallbackReceiver_concurrentCallbackI(cb), number, current.ctx);}voidCallbackI::initiateWaitCallback_async(const AMD_Callback_initiateWaitCallbackPtr& cb, const CallbackReceiverPrx& proxy, const Current& current){ proxy->waitCallback_async(new AMI_CallbackReceiver_waitCallbackI(cb));}voidCallbackI::initiateCallbackWithPayload_async(const AMD_Callback_initiateCallbackWithPayloadPtr& cb, const CallbackReceiverPrx& proxy, const Current& current){ Ice::ByteSeq seq(1000 * 1024, 0); proxy->callbackWithPayload_async(new AMI_CallbackReceiver_callbackWithPayloadI(cb), seq);}voidCallbackI::shutdown(const Ice::Current& current){ current.adapter->getCommunicator()->shutdown();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?