#pragma once #include "drape_frontend/message_queue.hpp" #include "drape/pointers.hpp" #include "std/atomic.hpp" namespace df { class Message; class MessageAcceptor { protected: MessageAcceptor(); virtual ~MessageAcceptor(){} virtual void AcceptMessage(ref_ptr message) = 0; /// Must be called by subclass on message target thread bool ProcessSingleMessage(bool waitForMessage = true); void CancelMessageWaiting(); void CloseQueue(); bool IsInInfinityWaiting() const; #ifdef DEBUG_MESSAGE_QUEUE bool IsQueueEmpty() const; size_t GetQueueSize() const; #endif using TFilterMessageFn = function)>; void EnableMessageFiltering(TFilterMessageFn needFilterMessageFn); void DisableMessageFiltering(); private: friend class ThreadsCommutator; void PostMessage(drape_ptr && message, MessagePriority priority); MessageQueue m_messageQueue; atomic m_infinityWaiting; TFilterMessageFn m_needFilterMessageFn; }; } // namespace df