PTLib  Version 2.18.8
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
plugin.h
Go to the documentation of this file.
1 /*
2  * plugin.h
3  *
4  * Plugin Class Declarations
5  *
6  * Portable Windows Library
7  *
8  * Contributor(s): Snark at GnomeMeeting
9  */
10 
11 #ifndef PTLIB_PLUGIN_H
12 #define PTLIB_PLUGIN_H
13 
15 //
16 // these templates implement an adapter to make the old style device plugins appear in the new factory system
17 //
18 
19 #include <ptlib/pfactory.h>
20 
21 #ifdef PWLIB_PLUGIN_API_VERSION
22  #ifdef PTLIB_PLUGIN_API_VERSION
23  #warning Ignoring PWLIB_PLUGIN_API_VERSION as PTLIB_PLUGIN_API_VERSION is defined!
24  #undef PWLIB_PLUGIN_API_VERSION
25  #else
26  #define PTLIB_PLUGIN_API_VERSION PWLIB_PLUGIN_API_VERSION
27  #endif
28 #else
29  #ifndef PTLIB_PLUGIN_API_VERSION
30  #define PTLIB_PLUGIN_API_VERSION 1
31  #endif
32 #endif
33 
34 
36 //
37 // Ancestor Service descriptor for plugins
38 //
39 
41 {
42  public:
43  static const char SeparatorChar;
44 
47  { }
48 
50 
51  virtual unsigned GetPluginAPIVersion() const { return m_version; }
52  virtual const char * GetServiceType() const = 0;
53  virtual const char * GetServiceName() const = 0;
54  virtual const char * GetFriendlyName() const { return GetServiceName(); }
55  virtual bool ValidateServiceName(const PString & name, P_INT_PTR userData) const;
56  virtual PObject * CreateInstance(P_INT_PTR userData) const = 0;
57 
58  protected:
59  unsigned m_version;
60 };
61 
62 
64 
65 
67 {
68  public:
69  virtual bool ValidateServiceName(const PString & name, P_INT_PTR userData) const;
70 
71  virtual PStringArray GetDeviceNames(P_INT_PTR userData) const;
72  virtual bool ValidateDeviceName(const PString & deviceName, P_INT_PTR userData) const;
73  virtual bool GetDeviceCapabilities(const PString & deviceName, void * capabilities) const;
74 };
75 
76 typedef PPluginDeviceDescriptor PDevicePluginServiceDescriptor; // Backward compatibility
77 
78 
80 
81 #define PCREATE_PLUGIN_SERVICE_EX(serviceType, BaseClass, extra) \
82  class PPlugin_##serviceType : public BaseClass { \
83  public: \
84  static const char * ServiceType() { return #serviceType; } \
85  virtual const char * GetServiceType() const { return ServiceType(); } \
86  extra \
87  }
88 
89 #define PCREATE_PLUGIN_SERVICE(serviceType) \
90  PCREATE_PLUGIN_SERVICE_EX(serviceType, PPluginServiceDescriptor, )
91 
92 #define PCREATE_PLUGIN_DEVICE(serviceType) \
93  PCREATE_PLUGIN_SERVICE_EX(serviceType, PPluginDeviceDescriptor, )
94 
95 
97 
98 #define PCREATE_PLUGIN_ARG_5(serviceName, serviceType, InstanceClass, DescriptorClass, extra) \
99  class PPlugin_##serviceType##_##serviceName : public DescriptorClass { \
100  public: \
101  static const char * ServiceName() { return #serviceName; } \
102  virtual const char * GetServiceName() const { return ServiceName(); } \
103  virtual PObject * CreateInstance(P_INT_PTR) const { return new InstanceClass; } \
104  extra \
105  }; \
106  PFACTORY_CREATE(PPluginFactory, PPlugin_##serviceType##_##serviceName, #serviceType #serviceName, true)
107 
108 #define PCREATE_PLUGIN_ARG_4(serviceName, serviceType, InstanceClass, DescriptorClass) \
109  PCREATE_PLUGIN_ARG_5(serviceName, serviceType, InstanceClass, DescriptorClass, )
110 
111 #define PCREATE_PLUGIN_ARG_3(serviceName, serviceType, InstanceClass) \
112  PCREATE_PLUGIN_ARG_4(serviceName, serviceType, InstanceClass, PPlugin_##serviceType)
113 
114 #define PCREATE_PLUGIN_ARG_2(serviceName, serviceType) \
115  PCREATE_PLUGIN_ARG_3(serviceName, serviceType, serviceType##_##serviceName)
116 
117 #define PCREATE_PLUGIN_PART1(narg, args) PCREATE_PLUGIN_PART2(narg, args)
118 #define PCREATE_PLUGIN_PART2(narg, args) PCREATE_PLUGIN_ARG_##narg args
119 
120 #define PCREATE_PLUGIN_STATIC(...) PCREATE_PLUGIN_PART1(PARG_COUNT(__VA_ARGS__), (__VA_ARGS__))
121 
122 
123 #define PPLUGIN_STATIC_LOAD(serviceName, serviceType) PFACTORY_LOAD(PPlugin_##serviceType##_##serviceName)
124 
125 
126 #if defined(_WIN32) && !defined(P_FORCE_STATIC_PLUGIN)
127  #define P_FORCE_STATIC_PLUGIN 1 // always define static plugins in Windows, since otherwise they seem not to work
128 #endif
129 
130 #if defined(P_PLUGINS) && !defined(P_FORCE_STATIC_PLUGIN)
131 
132  #define PCREATE_PLUGIN(serviceName, serviceType, ...) \
133  PCREATE_PLUGIN_STATIC(serviceName, serviceType, __VA_ARGS__) \
134  extern "C" void PWLibPlugin_TriggerRegister(PPluginManager * pluginMgr) \
135  { pluginMgr->RegisterService(#serviceType #serviceName); } \
136  extern "C" unsigned PWLibPlugin_GetAPIVersion (void) \
137  { return PTLIB_PLUGIN_API_VERSION; }
138 
139 #else
140 
141  #define PCREATE_PLUGIN(...) \
142  PCREATE_PLUGIN_STATIC(__VA_ARGS__)
143 
144 #endif
145 
146 
148 
149 
150 #endif // PTLIB_PLUGIN_H
151 
152 
153 // End Of File ///////////////////////////////////////////////////////////////
virtual bool ValidateServiceName(const PString &name, P_INT_PTR userData) const
virtual const char * GetServiceType() const =0
PFactory< PPluginServiceDescriptor > PPluginFactory
Definition: plugin.h:63
virtual unsigned GetPluginAPIVersion() const
Definition: plugin.h:51
PPluginServiceDescriptor()
Definition: plugin.h:45
virtual const char * GetFriendlyName() const
Definition: plugin.h:54
unsigned m_version
Definition: plugin.h:59
This is an array collection class of PString objects.
Definition: pstring.h:2365
PPluginDeviceDescriptor PDevicePluginServiceDescriptor
Definition: plugin.h:76
intptr_t P_INT_PTR
Definition: object.h:2646
virtual const char * GetServiceName() const =0
virtual PStringArray GetDeviceNames(P_INT_PTR userData) const
The character string class.
Definition: pstring.h:108
virtual bool GetDeviceCapabilities(const PString &deviceName, void *capabilities) const
virtual ~PPluginServiceDescriptor()
Definition: plugin.h:49
#define PTLIB_PLUGIN_API_VERSION
Definition: plugin.h:30
Class for a factory to create concrete class instances without parameters during construction.
Definition: pfactory.h:396
virtual PObject * CreateInstance(P_INT_PTR userData) const =0
Definition: plugin.h:40
static const char SeparatorChar
Definition: plugin.h:43
virtual bool ValidateServiceName(const PString &name, P_INT_PTR userData) const
Definition: plugin.h:66
Ultimate parent class for all objects in the class library.
Definition: object.h:2204
virtual bool ValidateDeviceName(const PString &deviceName, P_INT_PTR userData) const