Mercurial > hg > orthanc-stone
comparison Framework/Messages/ICallable.h @ 1059:e713f1a99861 broker
replacing MessageBroker by weak_ptr
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 11 Oct 2019 17:08:34 +0200 |
parents | 3f6e5a38c88f |
children | af4b9cba905f |
comparison
equal
deleted
inserted
replaced
1058:a36c47487a70 | 1059:e713f1a99861 |
---|---|
20 | 20 |
21 | 21 |
22 #pragma once | 22 #pragma once |
23 | 23 |
24 #include "IMessage.h" | 24 #include "IMessage.h" |
25 #include "IObserver.h" | |
25 | 26 |
26 #include <Core/Logging.h> | 27 #include <Core/Logging.h> |
27 | 28 |
28 #include <boost/noncopyable.hpp> | 29 #include <boost/noncopyable.hpp> |
30 #include <boost/weak_ptr.hpp> | |
29 | 31 |
30 #include <string> | 32 #include <string> |
31 | 33 |
32 namespace OrthancStone { | 34 namespace OrthancStone |
33 | 35 { |
34 class IObserver; | |
35 | |
36 // This is referencing an object and member function that can be notified | 36 // This is referencing an object and member function that can be notified |
37 // by an IObservable. The object must derive from IO | 37 // by an IObservable. The object must derive from IO |
38 // The member functions must be of type "void Function(const IMessage& message)" or reference a derived class of IMessage | 38 // The member functions must be of type "void Function(const IMessage& message)" or reference a derived class of IMessage |
39 class ICallable : public boost::noncopyable | 39 class ICallable : public boost::noncopyable |
40 { | 40 { |
45 | 45 |
46 virtual void Apply(const IMessage& message) = 0; | 46 virtual void Apply(const IMessage& message) = 0; |
47 | 47 |
48 virtual const MessageIdentifier& GetMessageIdentifier() = 0; | 48 virtual const MessageIdentifier& GetMessageIdentifier() = 0; |
49 | 49 |
50 virtual IObserver* GetObserver() const = 0; | 50 // TODO - Is this needed? |
51 virtual boost::weak_ptr<IObserver> GetObserver() const = 0; | |
51 }; | 52 }; |
52 | 53 |
54 | |
55 // TODO - Remove this class | |
53 template <typename TMessage> | 56 template <typename TMessage> |
54 class MessageHandler: public ICallable | 57 class MessageHandler : public ICallable |
55 { | 58 { |
56 }; | 59 }; |
57 | 60 |
58 | 61 |
59 template <typename TObserver, | 62 template <typename TObserver, |
61 class Callable : public MessageHandler<TMessage> | 64 class Callable : public MessageHandler<TMessage> |
62 { | 65 { |
63 private: | 66 private: |
64 typedef void (TObserver::* MemberFunction) (const TMessage&); | 67 typedef void (TObserver::* MemberFunction) (const TMessage&); |
65 | 68 |
66 TObserver& observer_; | 69 boost::weak_ptr<IObserver> observer_; |
67 MemberFunction function_; | 70 MemberFunction function_; |
68 std::string observerFingerprint_; | |
69 | 71 |
70 public: | 72 public: |
71 Callable(TObserver& observer, | 73 Callable(boost::shared_ptr<TObserver> observer, |
72 MemberFunction function) : | 74 MemberFunction function) : |
73 observer_(observer), | 75 observer_(observer), |
74 function_(function), | 76 function_(function) |
75 observerFingerprint_(observer.GetFingerprint()) | |
76 { | 77 { |
77 } | |
78 | |
79 void ApplyInternal(const TMessage& message) | |
80 { | |
81 std::string currentFingerprint(observer_.GetFingerprint()); | |
82 if (observerFingerprint_ != currentFingerprint) | |
83 { | |
84 LOG(TRACE) << "The observer at address " << | |
85 std::hex << &observer_ << std::dec << | |
86 ") has a different fingerprint than the one recorded at callback " << | |
87 "registration time. This means that it is not the same object as " << | |
88 "the one recorded, even though their addresses are the same. " << | |
89 "Callback will NOT be sent!"; | |
90 LOG(TRACE) << " recorded fingerprint = " << observerFingerprint_ << | |
91 " current fingerprint = " << currentFingerprint; | |
92 } | |
93 else | |
94 { | |
95 LOG(TRACE) << "The recorded fingerprint is " << observerFingerprint_ | |
96 << " and the current fingerprint is " << currentFingerprint | |
97 << " -- callable will be called."; | |
98 (observer_.*function_) (message); | |
99 } | |
100 } | 78 } |
101 | 79 |
102 virtual void Apply(const IMessage& message) | 80 virtual void Apply(const IMessage& message) |
103 { | 81 { |
104 ApplyInternal(dynamic_cast<const TMessage&>(message)); | 82 boost::shared_ptr<IObserver> lock(observer_); |
83 if (lock) | |
84 { | |
85 TObserver& observer = dynamic_cast<TObserver&>(*lock); | |
86 const TMessage& typedMessage = dynamic_cast<const TMessage&>(message); | |
87 (observer.*function_) (typedMessage); | |
88 } | |
105 } | 89 } |
106 | 90 |
107 virtual const MessageIdentifier& GetMessageIdentifier() | 91 virtual const MessageIdentifier& GetMessageIdentifier() |
108 { | 92 { |
109 return TMessage::GetStaticIdentifier(); | 93 return TMessage::GetStaticIdentifier(); |
110 } | 94 } |
111 | 95 |
112 virtual IObserver* GetObserver() const | 96 virtual boost::weak_ptr<IObserver> GetObserver() const |
113 { | 97 { |
114 return &observer_; | 98 return observer_; |
115 } | 99 } |
116 }; | 100 }; |
117 | 101 |
118 #if 0 /* __cplusplus >= 201103L*/ | 102 #if 0 /* __cplusplus >= 201103L*/ |
119 | 103 |