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 }