comparison Framework/Messages/IObservable.h @ 299:3897f9f28cfa am-callable-and-promise

backup work in progress: updated messaging framework with ICallable
author am@osimis.io
date Fri, 14 Sep 2018 16:44:01 +0200
parents 5bd4161bf11b
children b4abaeb783b1
comparison
equal deleted inserted replaced
298:f58bfb7bbcc9 299:3897f9f28cfa
23 23
24 #include <set> 24 #include <set>
25 #include <assert.h> 25 #include <assert.h>
26 #include <algorithm> 26 #include <algorithm>
27 #include <iostream> 27 #include <iostream>
28 #include <map>
28 29
29 #include "MessageBroker.h" 30 #include "MessageBroker.h"
30 #include "MessageType.h" 31 #include "MessageType.h"
32 #include "ICallable.h"
31 #include "IObserver.h" 33 #include "IObserver.h"
32 34
33 namespace OrthancStone { 35 namespace OrthancStone {
34 36
35 class MessageNotDeclaredException : public std::logic_error 37 class MessageNotDeclaredException : public std::logic_error
46 class IObservable : public boost::noncopyable 48 class IObservable : public boost::noncopyable
47 { 49 {
48 protected: 50 protected:
49 MessageBroker& broker_; 51 MessageBroker& broker_;
50 52
51 std::set<IObserver*> observers_; 53 typedef std::map<int, std::set<ICallable*> > Callables;
54 Callables callables_;
52 std::set<MessageType> emittableMessages_; 55 std::set<MessageType> emittableMessages_;
53 56
54 public: 57 public:
55 58
56 IObservable(MessageBroker& broker) 59 IObservable(MessageBroker& broker)
57 : broker_(broker) 60 : broker_(broker)
58 { 61 {
59 } 62 }
60 virtual ~IObservable() 63 virtual ~IObservable()
61 { 64 {
65 for (Callables::const_iterator it = callables_.begin();
66 it != callables_.end(); ++it)
67 {
68 for (std::set<ICallable*>::const_iterator
69 it2 = it->second.begin(); it2 != it->second.end(); ++it2)
70 {
71 delete *it2;
72 }
73 }
74 }
75
76 void RegisterObserverCallback(ICallable* callable)
77 {
78 MessageType messageType = callable->GetMessageType();
79
80 callables_[messageType].insert(callable);
62 } 81 }
63 82
64 void EmitMessage(const IMessage& message) 83 void EmitMessage(const IMessage& message)
65 { 84 {
66 if (emittableMessages_.find(message.GetType()) == emittableMessages_.end()) 85 if (emittableMessages_.find(message.GetType()) == emittableMessages_.end())
67 { 86 {
68 throw MessageNotDeclaredException(message.GetType()); 87 throw MessageNotDeclaredException(message.GetType());
69 } 88 }
70 89
71 broker_.EmitMessage(*this, observers_, message); 90 Callables::const_iterator found = callables_.find(message.GetType());
91
92 if (found != callables_.end())
93 {
94 for (std::set<ICallable*>::const_iterator
95 it = found->second.begin(); it != found->second.end(); ++it)
96 {
97 if (broker_.IsActive((*it)->GetObserver()))
98 {
99 (*it)->Apply(message);
100 }
101 }
102 }
72 } 103 }
73
74 void RegisterObserver(IObserver& observer)
75 {
76 CheckObserverDeclaredAllObservableMessages(observer);
77 observers_.insert(&observer);
78 }
79
80 void UnregisterObserver(IObserver& observer)
81 {
82 observers_.erase(&observer);
83 }
84
85 const std::set<MessageType>& GetEmittableMessages() const 104 const std::set<MessageType>& GetEmittableMessages() const
86 { 105 {
87 return emittableMessages_; 106 return emittableMessages_;
88 } 107 }
89
90 protected: 108 protected:
91 109
92 void DeclareEmittableMessage(MessageType messageType) 110 void DeclareEmittableMessage(MessageType messageType)
93 { 111 {
94 emittableMessages_.insert(messageType); 112 emittableMessages_.insert(messageType);
95 } 113 }
96 114
97 void CheckObserverDeclaredAllObservableMessages(IObserver& observer)
98 {
99 for (std::set<MessageType>::const_iterator it = emittableMessages_.begin(); it != emittableMessages_.end(); it++)
100 {
101 // the observer must have "declared" all observable messages
102 if (observer.GetHandledMessages().find(*it) == observer.GetHandledMessages().end()
103 && observer.GetIgnoredMessages().find(*it) == observer.GetIgnoredMessages().end())
104 {
105 throw MessageNotDeclaredException(*it);
106 }
107 }
108 }
109 }; 115 };
110 116
111 } 117 }