Mercurial > hg > orthanc-stone
comparison Framework/Messages/IObservable.cpp @ 1067:05b2e71ed145 broker
removed MessageForwarder, unit tests are ok
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 15 Oct 2019 18:11:40 +0200 |
parents | 9d42f89b8c3c |
children | 81b29bc7c3d4 |
comparison
equal
deleted
inserted
replaced
1066:b537002f83a9 | 1067:05b2e71ed145 |
---|---|
38 it2 = it->second.begin(); it2 != it->second.end(); ++it2) | 38 it2 = it->second.begin(); it2 != it->second.end(); ++it2) |
39 { | 39 { |
40 delete *it2; | 40 delete *it2; |
41 } | 41 } |
42 } | 42 } |
43 | |
44 // unregister the forwarders but don't delete them (they'll be | |
45 // deleted by the observable they are observing as any other | |
46 // callable) | |
47 for (Forwarders::iterator it = forwarders_.begin(); | |
48 it != forwarders_.end(); ++it) | |
49 { | |
50 IMessageForwarder* fw = *it; | |
51 | |
52 // TODO - What to do with forwarders? | |
53 | |
54 //broker_.Unregister(dynamic_cast<IObserver&>(*fw)); | |
55 } | |
56 } | 43 } |
57 | 44 |
58 | 45 |
59 void IObservable::RegisterCallable(ICallable* callable) | 46 void IObservable::RegisterCallable(ICallable* callable) |
60 { | 47 { |
65 | 52 |
66 const MessageIdentifier& id = callable->GetMessageIdentifier(); | 53 const MessageIdentifier& id = callable->GetMessageIdentifier(); |
67 callables_[id].insert(callable); | 54 callables_[id].insert(callable); |
68 } | 55 } |
69 | 56 |
70 void IObservable::Unregister(IObserver *observer) | |
71 { | |
72 LOG(TRACE) << "IObservable::Unregister for IObserver at addr: " | |
73 << std::hex << observer << std::dec; | |
74 // delete all callables from this observer | |
75 for (Callables::iterator itCallableSet = callables_.begin(); | |
76 itCallableSet != callables_.end(); ++itCallableSet) | |
77 { | |
78 for (std::set<ICallable*>::const_iterator | |
79 itCallable = itCallableSet->second.begin(); itCallable != itCallableSet->second.end(); ) | |
80 { | |
81 boost::shared_ptr<IObserver> shared((*itCallable)->GetObserver()); | |
82 | |
83 if (shared && | |
84 shared.get() == observer) | |
85 { | |
86 LOG(TRACE) << " ** IObservable::Unregister : deleting callable: " | |
87 << std::hex << (*itCallable) << std::dec; | |
88 delete *itCallable; | |
89 itCallableSet->second.erase(itCallable++); | |
90 } | |
91 else | |
92 ++itCallable; | |
93 } | |
94 } | |
95 } | |
96 | |
97 void IObservable::EmitMessageInternal(const IObserver* receiver, | 57 void IObservable::EmitMessageInternal(const IObserver* receiver, |
98 const IMessage& message) | 58 const IMessage& message) |
99 { | 59 { |
100 LOG(TRACE) << "IObservable::EmitMessageInternal receiver = " | 60 LOG(TRACE) << "IObservable::EmitMessageInternal receiver = " |
101 << std::hex << receiver << std::dec; | 61 << std::hex << receiver << std::dec; |
106 for (std::set<ICallable*>::const_iterator | 66 for (std::set<ICallable*>::const_iterator |
107 it = found->second.begin(); it != found->second.end(); ++it) | 67 it = found->second.begin(); it != found->second.end(); ++it) |
108 { | 68 { |
109 assert(*it != NULL); | 69 assert(*it != NULL); |
110 | 70 |
111 boost::shared_ptr<IObserver> observer((*it)->GetObserver()); | 71 boost::shared_ptr<IObserver> observer((*it)->GetObserver().lock()); |
112 | 72 |
113 if (observer) | 73 if (observer) |
114 { | 74 { |
115 if (receiver == NULL || // Are we broadcasting? | 75 if (receiver == NULL || // Are we broadcasting? |
116 observer.get() == receiver) // Not broadcasting, but this is the receiver | 76 observer.get() == receiver) // Not broadcasting, but this is the receiver |
139 { | 99 { |
140 LOG(TRACE) << "IObservable::EmitMessage observer = " | 100 LOG(TRACE) << "IObservable::EmitMessage observer = " |
141 << std::hex << &observer << std::dec; | 101 << std::hex << &observer << std::dec; |
142 EmitMessageInternal(&observer, message); | 102 EmitMessageInternal(&observer, message); |
143 } | 103 } |
144 | |
145 void IObservable::RegisterForwarder(IMessageForwarder* forwarder) | |
146 { | |
147 if (forwarder == NULL) | |
148 { | |
149 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
150 } | |
151 | |
152 forwarders_.insert(forwarder); | |
153 } | |
154 } | 104 } |