comparison OrthancStone/Sources/Messages/ICallable.h @ 1512:244ad1e4e76a

reorganization of folders
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 07 Jul 2020 16:21:02 +0200
parents Framework/Messages/ICallable.h@30deba7bc8e2
children 8563ea5d8ae4
comparison
equal deleted inserted replaced
1511:9dfeee74c1e6 1512:244ad1e4e76a
1 /**
2 * Stone of Orthanc
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
4 * Department, University Hospital of Liege, Belgium
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium
6 *
7 * This program is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU Affero General Public License
9 * as published by the Free Software Foundation, either version 3 of
10 * the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Affero General Public License for more details.
16 *
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 **/
20
21
22 #pragma once
23
24 #include "IMessage.h"
25 #include "IObserver.h"
26
27 #include <Logging.h>
28
29 #include <boost/noncopyable.hpp>
30 #include <boost/weak_ptr.hpp>
31
32 #include <string>
33 #include <stdint.h>
34
35 namespace OrthancStone
36 {
37 // This is referencing an object and member function that can be notified
38 // by an IObservable. The object must derive from IO
39 // The member functions must be of type "void Method(const IMessage& message)" or reference a derived class of IMessage
40 class ICallable : public boost::noncopyable
41 {
42 public:
43 virtual ~ICallable()
44 {
45 }
46
47 virtual void Apply(const IMessage& message) = 0;
48
49 virtual const MessageIdentifier& GetMessageIdentifier() = 0;
50
51 // TODO - Is this needed?
52 virtual boost::weak_ptr<IObserver> GetObserver() const = 0;
53 };
54
55
56 template <typename TObserver,
57 typename TMessage>
58 class Callable : public ICallable
59 {
60 private:
61 typedef void (TObserver::* MemberMethod) (const TMessage&);
62
63 boost::weak_ptr<IObserver> observer_;
64 MemberMethod function_;
65
66 public:
67 Callable(boost::shared_ptr<TObserver> observer,
68 MemberMethod function) :
69 observer_(observer),
70 function_(function)
71 {
72 }
73
74 virtual void Apply(const IMessage& message)
75 {
76 boost::shared_ptr<IObserver> lock(observer_);
77 if (lock)
78 {
79 TObserver& observer = dynamic_cast<TObserver&>(*lock);
80 const TMessage& typedMessage = dynamic_cast<const TMessage&>(message);
81 (observer.*function_) (typedMessage);
82 }
83 }
84
85 virtual const MessageIdentifier& GetMessageIdentifier()
86 {
87 return TMessage::GetStaticIdentifier();
88 }
89
90 virtual boost::weak_ptr<IObserver> GetObserver() const
91 {
92 return observer_;
93 }
94 };
95 }