Mercurial > hg > orthanc-stone
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 } |