/** * @RDE_HEADER@ * AvsCommandQueue * $Id$ * $HeadURL$ * $Author$ * Created by Christian Fröbel, NLSE, 2018-02-23 */ #pragma once #include "logger.h" #include "avm_export.h" #include #include #include #include #include namespace LtsUtils { class IConnection; } namespace AudioVideoManagement { class ICommand; /** * CommandQueue used by AvaControl and VdControl. * The CommandQueue ensures that each command is sent after the previous command finished. * When a command is not finished within a defined time frame timeout() is signalled. * * @author Christian Fröbel */ class AVM_COMMON_EXPORT AvsCommandQueue : public QObject { Q_OBJECT public: /** * @param timeout Timeout within which each command must be completed. Use 0 to disable the timeout. */ explicit AvsCommandQueue(std::chrono::milliseconds timeout); ~AvsCommandQueue() override; void queue(std::unique_ptr cmd, std::unique_ptr connection); void done(); ICommand *currentCommand() const; bool currentHasConnection() const; LtsUtils::IConnection *currentConnection() const; void flush(); /** * Tell the Queue that the current command is still alive. * Internal Timeout timer will be reset. */ void alive(); bool isEmpty() const { return m_queue.empty(); } signals: /** * Signalled whenever the queue is empty again. This can have several reasons: * - The last command finished successfully. * - flush() was called while commands are pending. * - This instance is deleted with pending commands which get flushed then. */ void queueEmpty(); /** Signalled if the current command did not finish within the defined time frame. */ void timeout(); private: void nextCommand(); void tryReduce(); private: /** * Associates a command with a Qt-connection (signal-signal or signal-slot). * In a scenario where multiple clients use an AvaControl instance * this makes it possible to give the asynchronous response only * to the initiator of the command. */ struct CommandWithConn { std::unique_ptr cmd; std::unique_ptr connection; }; std::deque m_queue; QTimer m_timer; LOGGER_T m_logger; }; } // namespace AudioVideoManagement