Mercurial > hg > orthanc-stone
comparison Framework/Messages/IObservable.h @ 300:b4abaeb783b1 am-callable-and-promise
messaging refactoring almost complete: works fine in native
author | am@osimis.io |
---|---|
date | Tue, 18 Sep 2018 15:23:21 +0200 |
parents | 3897f9f28cfa |
children | 4a79193ffb58 |
comparison
equal
deleted
inserted
replaced
299:3897f9f28cfa | 300:b4abaeb783b1 |
---|---|
32 #include "ICallable.h" | 32 #include "ICallable.h" |
33 #include "IObserver.h" | 33 #include "IObserver.h" |
34 | 34 |
35 namespace OrthancStone { | 35 namespace OrthancStone { |
36 | 36 |
37 class MessageNotDeclaredException : public std::logic_error | |
38 { | |
39 MessageType messageType_; | |
40 public: | |
41 MessageNotDeclaredException(MessageType messageType) | |
42 : std::logic_error("Message not declared by observer."), | |
43 messageType_(messageType) | |
44 { | |
45 } | |
46 }; | |
47 | |
48 class IObservable : public boost::noncopyable | 37 class IObservable : public boost::noncopyable |
49 { | 38 { |
50 protected: | 39 protected: |
51 MessageBroker& broker_; | 40 MessageBroker& broker_; |
52 | 41 |
53 typedef std::map<int, std::set<ICallable*> > Callables; | 42 typedef std::map<int, std::set<ICallable*> > Callables; |
54 Callables callables_; | 43 Callables callables_; |
55 std::set<MessageType> emittableMessages_; | |
56 | 44 |
57 public: | 45 public: |
58 | 46 |
59 IObservable(MessageBroker& broker) | 47 IObservable(MessageBroker& broker) |
60 : broker_(broker) | 48 : broker_(broker) |
80 callables_[messageType].insert(callable); | 68 callables_[messageType].insert(callable); |
81 } | 69 } |
82 | 70 |
83 void EmitMessage(const IMessage& message) | 71 void EmitMessage(const IMessage& message) |
84 { | 72 { |
85 if (emittableMessages_.find(message.GetType()) == emittableMessages_.end()) | |
86 { | |
87 throw MessageNotDeclaredException(message.GetType()); | |
88 } | |
89 | |
90 Callables::const_iterator found = callables_.find(message.GetType()); | 73 Callables::const_iterator found = callables_.find(message.GetType()); |
91 | 74 |
92 if (found != callables_.end()) | 75 if (found != callables_.end()) |
93 { | 76 { |
94 for (std::set<ICallable*>::const_iterator | 77 for (std::set<ICallable*>::const_iterator |
99 (*it)->Apply(message); | 82 (*it)->Apply(message); |
100 } | 83 } |
101 } | 84 } |
102 } | 85 } |
103 } | 86 } |
104 const std::set<MessageType>& GetEmittableMessages() const | |
105 { | |
106 return emittableMessages_; | |
107 } | |
108 protected: | |
109 | |
110 void DeclareEmittableMessage(MessageType messageType) | |
111 { | |
112 emittableMessages_.insert(messageType); | |
113 } | |
114 | 87 |
115 }; | 88 }; |
116 | 89 |
117 } | 90 } |