All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ActiveObject.h
1 // Copyright eeGeo Ltd (2012-2014), All Rights Reserved
2 
3 #pragma once
4 
5 #include "IRunnable.h"
6 #include "MessageQueue.h"
7 #include "Types.h"
8 
9 namespace Eegeo
10 {
11  namespace Messaging
12  {
13  template <typename TMessage, typename TDispatcher>
14  class ActiveObject : public TDispatcher, protected Eegeo::NonCopyable
15  {
16  public:
17  ActiveObject()
18  : m_messageQueue(MessageQueue<TMessage>())
19  {
20  }
21 
23  : m_messageQueue(messageQueue)
24  {
25  }
26 
27  virtual ~ActiveObject() { }
28 
29  void SendMessage(TMessage message)
30  {
31  m_messageQueue.Enqueue(message);
32  }
33 
34  bool ProcessAllAvailableMessages()
35  {
36  TMessage message;
37 
38  OnBeforeMessagesHandled();
39 
40  while(m_messageQueue.TryDequeue(message))
41  {
42  bool continueRunning = ProcessMessage(message);
43  if(!continueRunning)
44  {
45  return false;
46  }
47  }
48  return true;
49  }
50 
51  bool WaitAndProcessSingleMessage()
52  {
53  TMessage message = m_messageQueue.Dequeue();
54  bool continueRunning = ProcessMessage(message);
55  return continueRunning;
56  }
57 
58  virtual void OnMessageHandled(TMessage message) { }
59  virtual void OnBeforeMessagesHandled() { }
60  virtual void OnAllMessagesHandled() { }
61  virtual void OnStarted() { }
62  virtual void OnStopped() { }
63 
64  private:
65  MessageQueue<TMessage>& m_messageQueue;
66 
67  bool ProcessMessage(TMessage message)
68  {
69  bool continueRunning = message->Handle(*this);
70  OnMessageHandled(message);
71  return continueRunning;
72  }
73  };
74  }
75 }