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 }