PTLib  Version 2.10.10
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
notifier_ext.h
Go to the documentation of this file.
1 /*
2  * notifier_ext.h
3  *
4  * Smart Notifiers and Notifier Lists
5  *
6  * Portable Windows Library
7  *
8  * Copyright (c) 2004 Reitek S.p.A.
9  *
10  * The contents of this file are subject to the Mozilla Public License
11  * Version 1.0 (the "License"); you may not use this file except in
12  * compliance with the License. You may obtain a copy of the License at
13  * http://www.mozilla.org/MPL/
14  *
15  * Software distributed under the License is distributed on an "AS IS"
16  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
17  * the License for the specific language governing rights and limitations
18  * under the License.
19  *
20  * The Original Code is Portable Windows Library.
21  *
22  * The Initial Developer of the Original Code is Post Increment
23  *
24  * Contributor(s): ______________________________________.
25  *
26  * $Revision: 21788 $
27  * $Author: rjongbloed $
28  * $Date: 2008-12-11 23:42:13 -0600 (Thu, 11 Dec 2008) $
29  */
30 
31 #ifndef PTLIB_NOTIFIER_EXT_H
32 #define PTLIB_NOTIFIER_EXT_H
33 
34 #ifdef P_USE_PRAGMA
35 #pragma interface
36 #endif
37 
47 {
48  public:
49  PSmartNotifieeRegistrar() : m_ID(P_MAX_INDEX) {}
51 
52  void Init(void * obj) { if (m_ID == P_MAX_INDEX) m_ID = RegisterNotifiee(obj); }
53  unsigned GetID() const { return m_ID; }
54 
55  static unsigned RegisterNotifiee(void * obj);
56  static PBoolean UnregisterNotifiee(unsigned id);
57  static PBoolean UnregisterNotifiee(void * obj);
58  static void * GetNotifiee(unsigned id);
59 
60  protected:
61  unsigned m_ID;
62 };
63 
65 {
67 
68  protected:
69  unsigned m_NotifieeID;
70 
71  public:
73  unsigned GetNotifieeID() const { return m_NotifieeID; }
75  PBoolean IsValid() const { return GetNotifiee() != 0; }
76 };
77 
78 #define PDECLARE_SMART_NOTIFIEE \
79  PSmartNotifieeRegistrar m_Registrar; \
80 
81 #define PCREATE_SMART_NOTIFIEE m_Registrar.Init(this)
82 
83 #define PDECLARE_SMART_NOTIFIER(notifier, notifiee, func) \
84  class func##_PSmartNotifier : public PSmartNotifierFunction { \
85  public: \
86  func##_PSmartNotifier(unsigned id) : PSmartNotifierFunction(id) { } \
87  virtual void Call(PObject & note, INT extra) const \
88  { \
89  void * obj = GetNotifiee(); \
90  if (obj) \
91  ((notifiee*)obj)->func((notifier &)note, extra); \
92  else \
93  PTRACE(2, "PWLib\tInvalid notifiee"); \
94  } \
95  }; \
96  friend class func##_PSmartNotifier; \
97  virtual void func(notifier & note, INT extra)
98 
99 #define PCREATE_SMART_NOTIFIER(func) PNotifier(new func##_PSmartNotifier(m_Registrar.GetID()))
100 
101 
102 class PNotifierList : public PObject
103 {
104  PCLASSINFO(PNotifierList, PObject);
105  private:
106  PLIST(_PNotifierList, PNotifier);
107 
108  _PNotifierList m_TheList;
109 
110  // Removes smart pointers to deleted objects
111  void Cleanup();
112 
113  public:
114  PINDEX GetSize() const { return m_TheList.GetSize(); }
115 
116  void Add(PNotifier * handler) { m_TheList.Append(handler); }
117  void Remove(PNotifier * handler) { m_TheList.Remove(handler); }
119  PBoolean Fire(PObject& obj, INT val = 0);
120 
121  // Moves all the notifiers in "that" to "this"
122  void Move(PNotifierList& that);
123 };
124 
125 
126 #endif // PTLIB_NOTIFIER_EXT_H
127 
128 
129 // End of File ///////////////////////////////////////////////////////////////
~PSmartNotifieeRegistrar()
Definition: notifier_ext.h:50
Definition: notifier_ext.h:64
PBoolean IsValid() const
Definition: notifier_ext.h:75
unsigned GetNotifieeID() const
Definition: notifier_ext.h:73
Class specialisation for PNotifierTemplate<INT>
Implements a function similar to the PNotifier, but uses an "id" to link the caller and callee rather...
Definition: notifier_ext.h:46
PBoolean RemoveTarget(PObject *obj)
PSmartNotifieeRegistrar()
Definition: notifier_ext.h:49
BOOL PBoolean
Definition: object.h:102
PINDEX GetSize() const
Definition: notifier_ext.h:114
unsigned m_ID
Definition: notifier_ext.h:61
void Add(PNotifier *handler)
Definition: notifier_ext.h:116
void Init(void *obj)
Definition: notifier_ext.h:52
unsigned m_NotifieeID
Definition: notifier_ext.h:69
static void * GetNotifiee(unsigned id)
static unsigned RegisterNotifiee(void *obj)
void Remove(PNotifier *handler)
Definition: notifier_ext.h:117
unsigned GetID() const
Definition: notifier_ext.h:53
static PBoolean UnregisterNotifiee(unsigned id)
void * GetNotifiee() const
Definition: notifier_ext.h:74
This is an abstract class for which a descendent is declared for every function that may be called...
Definition: notifier.h:63
Definition: notifier_ext.h:102
PSmartNotifierFunction(unsigned id)
Definition: notifier_ext.h:72
Ultimate parent class for all objects in the class library.
Definition: object.h:1118
PBoolean Fire(PObject &obj, INT val=0)
void Move(PNotifierList &that)