/* Copyright (C) 2017 * swift Project Community / Contributors * * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level * directory of this distribution. No part of swift project, including this file, may be copied, modified, propagated, * or distributed except according to the terms contained in the LICENSE file. */ //! \file #ifndef BLACKMISC_SHAREDSTATE_ACTIVEOBSERVER_H #define BLACKMISC_SHAREDSTATE_ACTIVEOBSERVER_H #include "blackmisc/sharedstate/passiveobserver.h" #include "blackmisc/promise.h" #include "blackmisc/variant.h" #include "blackmisc/blackmiscexport.h" #include #include namespace BlackMisc { namespace SharedState { /*! * Extends CPassiveObserver with the ability to send requests and receive replies. * \ingroup SharedState */ class BLACKMISC_EXPORT CActiveObserver final : public CPassiveObserver { Q_OBJECT friend QSharedPointer; template CActiveObserver(T *parent, F eventHandler) : CPassiveObserver(parent, eventHandler) {} public: //! Factory method. template static auto create(T *parent, F eventHandler) { return QSharedPointer::create(parent, eventHandler); } //! Send a request and receive a synchronous reply. CVariant request(const CVariant ¶m); //! Send a request and receive an asynchronous reply. //! The callback will not be called if the reply is received after the observer has been destroyed. void requestAsync(const CVariant ¶m, std::function callback); //! Get a QWeakPointer pointing to this object. QWeakPointer weakRef() const { return qSharedPointerCast(CPassiveObserver::weakRef()); } signals: //! Emitted by request and requestAsync. void requestPosted(const BlackMisc::CVariant ¶m, BlackMisc::CPromise o_reply); }; } } #endif