comparison Framework/Messages/IObservable.h @ 267:89d02de83c03 am-2

added declaretion of messages handled/emitted
author am@osimis.io
date Wed, 22 Aug 2018 14:59:20 +0200
parents c9cf95b49a86
children 5bd4161bf11b
comparison
equal deleted inserted replaced
266:c9cf95b49a86 267:89d02de83c03
19 **/ 19 **/
20 20
21 21
22 #pragma once 22 #pragma once
23 23
24 #include <set>
25 #include <assert.h>
26 #include <algorithm>
27 #include <iostream>
28
24 #include "MessageBroker.h" 29 #include "MessageBroker.h"
25 #include <set> 30 #include "MessageType.h"
31 #include "IObserver.h"
26 32
27 namespace OrthancStone { 33 namespace OrthancStone {
34
35 class MessageNotDeclaredException : public std::logic_error
36 {
37 MessageType messageType_;
38 public:
39 MessageNotDeclaredException(MessageType messageType)
40 : std::logic_error("Message not declared by observer."),
41 messageType_(messageType)
42 {
43 }
44 };
28 45
29 class IObservable : public boost::noncopyable 46 class IObservable : public boost::noncopyable
30 { 47 {
31 protected: 48 protected:
32 MessageBroker& broker_; 49 MessageBroker& broker_;
33 50
34 std::set<IObserver*> observers_; 51 std::set<IObserver*> observers_;
52 std::set<MessageType> emittableMessages_;
35 53
36 public: 54 public:
37 55
38 IObservable(MessageBroker& broker) 56 IObservable(MessageBroker& broker)
39 : broker_(broker) 57 : broker_(broker)
43 { 61 {
44 } 62 }
45 63
46 void EmitMessage(const IMessage& message) const 64 void EmitMessage(const IMessage& message) const
47 { 65 {
66 if (emittableMessages_.find(message.GetType()) == emittableMessages_.end())
67 {
68 throw MessageNotDeclaredException(message.GetType());
69 }
70
48 broker_.EmitMessage(*this, observers_, message); 71 broker_.EmitMessage(*this, observers_, message);
49 } 72 }
50 73
51 void RegisterObserver(IObserver& observer) 74 void RegisterObserver(IObserver& observer)
52 { 75 {
76 CheckObserverDeclaredAllObservableMessages(observer);
53 observers_.insert(&observer); 77 observers_.insert(&observer);
54 } 78 }
55 79
56 void UnregisterObserver(IObserver& observer) 80 void UnregisterObserver(IObserver& observer)
57 { 81 {
58 observers_.erase(&observer); 82 observers_.erase(&observer);
59 } 83 }
84
85 const std::set<MessageType>& GetEmittableMessages() const
86 {
87 return emittableMessages_;
88 }
89
90 protected:
91
92 void DeclareEmittableMessage(MessageType messageType)
93 {
94 emittableMessages_.insert(messageType);
95 }
96
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 }
60 }; 109 };
61 110
62 } 111 }