root / CCV-HAND / libs / poco / include / Poco / NObserver.h @ 59

View | Annotate | Download (3.7 KB)

1
//
2
// NObserver.h
3
//
4
// $Id: //poco/1.3/Foundation/include/Poco/NObserver.h#1 $
5
//
6
// Library: Foundation
7
// Package: Notifications
8
// Module:  NotificationCenter
9
//
10
// Definition of the NObserver class template.
11
//
12
// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
13
// and Contributors.
14
//
15
// Permission is hereby granted, free of charge, to any person or organization
16
// obtaining a copy of the software and accompanying documentation covered by
17
// this license (the "Software") to use, reproduce, display, distribute,
18
// execute, and transmit the Software, and to prepare derivative works of the
19
// Software, and to permit third-parties to whom the Software is furnished to
20
// do so, all subject to the following:
21
// 
22
// The copyright notices in the Software and this entire statement, including
23
// the above license grant, this restriction and the following disclaimer,
24
// must be included in all copies of the Software, in whole or in part, and
25
// all derivative works of the Software, unless such copies or derivative
26
// works are solely in the form of machine-executable object code generated by
27
// a source language processor.
28
// 
29
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
32
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
33
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
34
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
35
// DEALINGS IN THE SOFTWARE.
36
//
37
38
39
#ifndef Foundation_NObserver_INCLUDED
40
#define Foundation_NObserver_INCLUDED
41
42
43
#include "Poco/Foundation.h"
44
#include "Poco/AbstractObserver.h"
45
#include "Poco/AutoPtr.h"
46
47
48
namespace Poco {
49
50
51
template <class C, class N>
52
class NObserver: public AbstractObserver
53
        /// This template class implements an adapter that sits between
54
        /// a NotificationCenter and an object receiving notifications
55
        /// from it. It is quite similar in concept to the 
56
        /// RunnableAdapter, but provides some NotificationCenter
57
        /// specific additional methods.
58
        /// See the NotificationCenter class for information on how
59
        /// to use this template class.
60
        ///
61
        /// This class template is quite similar to the Observer class
62
        /// template. The only difference is that the NObserver
63
        /// expects the callback function to accept a const AutoPtr& 
64
        /// instead of a plain pointer as argument, thus simplifying memory
65
        /// management.
66
{
67
public:
68
        typedef AutoPtr<N> NotificationPtr;
69
        typedef void (C::*Callback)(const NotificationPtr&);
70
71
        NObserver(C& object, Callback method): 
72
                _pObject(&object), 
73
                _method(method)
74
        {
75
        }
76
        
77
        NObserver(const NObserver& observer):
78
                AbstractObserver(observer),
79
                _pObject(observer._pObject), 
80
                _method(observer._method)
81
        {
82
        }
83
        
84
        ~NObserver()
85
        {
86
        }
87
        
88
        NObserver& operator = (const NObserver& observer)
89
        {
90
                if (&observer != this)
91
                {
92
                        _pObject = observer._pObject;
93
                        _method  = observer._method;
94
                }
95
                return *this;
96
        }
97
        
98
        void notify(Notification* pNf) const
99
        {
100
                N* pCastNf = dynamic_cast<N*>(pNf);
101
                if (pCastNf)
102
                {
103
                        NotificationPtr ptr(pCastNf, true);
104
                        (_pObject->*_method)(ptr);
105
                }
106
        }
107
        
108
        bool equals(const AbstractObserver& abstractObserver) const
109
        {
110
                const NObserver* pObs = dynamic_cast<const NObserver*>(&abstractObserver);
111
                return pObs && pObs->_pObject == _pObject && pObs->_method == _method;
112
        }
113
114
        bool accepts(Notification* pNf) const
115
        {
116
                return dynamic_cast<N*>(pNf) != 0;
117
        }
118
        
119
        AbstractObserver* clone() const
120
        {
121
                return new NObserver(*this);
122
        }
123
        
124
private:
125
        NObserver();
126
127
        C*       _pObject;
128
        Callback _method;
129
};
130
131
132
} // namespace Poco
133
134
135
#endif // Foundation_NObserver_INCLUDED