1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Dynamic loading framework
4 // Author: Ron Lee, David Falkinder, Vadim Zeitlin and a cast of 1000's
5 // (derived in part from dynlib.cpp (c) 1998 Guilhem Lavaux)
9 // Copyright: (c) 2001 Ron Lee <ron@debian.org>
10 // Licence: wxWindows licence
11 /////////////////////////////////////////////////////////////////////////////
13 #ifndef _WX_DYNAMICLOADER_H__
14 #define _WX_DYNAMICLOADER_H__
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
22 #if wxUSE_DYNAMIC_LOADER
24 #include "wx/dynlib.h"
25 #include "wx/hashmap.h"
26 #include "wx/module.h"
28 class WXDLLIMPEXP_FWD_BASE wxPluginLibrary
;
31 WX_DECLARE_STRING_HASH_MAP_WITH_DECL(wxPluginLibrary
*, wxDLManifest
,
32 class WXDLLIMPEXP_BASE
);
33 typedef wxDLManifest wxDLImports
;
35 // ---------------------------------------------------------------------------
37 // ---------------------------------------------------------------------------
39 // NOTE: Do not attempt to use a base class pointer to this class.
40 // wxDL is not virtual and we deliberately hide some of it's
43 // Unless you know exacty why you need to, you probably shouldn't
44 // instantiate this class directly anyway, use wxPluginManager
47 class WXDLLIMPEXP_BASE wxPluginLibrary
: public wxDynamicLibrary
51 static wxDLImports
* ms_classes
; // Static hash of all imported classes.
53 wxPluginLibrary( const wxString
&libname
, int flags
= wxDL_DEFAULT
);
56 wxPluginLibrary
*RefLib();
59 // These two are called by the PluginSentinel on (PLUGGABLE) object
60 // creation/destruction. There is usually no reason for the user to
61 // call them directly. We have to separate this from the link count,
62 // since the two are not interchangeable.
64 // FIXME: for even better debugging PluginSentinel should register
65 // the name of the class created too, then we can state
66 // exactly which object was not destroyed which may be
67 // difficult to find otherwise. Also this code should
68 // probably only be active in DEBUG mode, but let's just
69 // get it right first.
71 void RefObj() { ++m_objcount
; }
74 wxASSERT_MSG( m_objcount
> 0, wxT("Too many objects deleted??") );
78 // Override/hide some base class methods
80 bool IsLoaded() const { return m_linkcount
> 0; }
81 void Unload() { UnrefLib(); }
85 // These pointers may be NULL but if they are not, then m_ourLast follows
86 // m_ourFirst in the linked list, i.e. can be found by calling GetNext() a
87 // sufficient number of times.
88 const wxClassInfo
*m_ourFirst
; // first class info in this plugin
89 const wxClassInfo
*m_ourLast
; // ..and the last one
91 size_t m_linkcount
; // Ref count of library link calls
92 size_t m_objcount
; // ..and (pluggable) object instantiations.
93 wxModuleList m_wxmodules
; // any wxModules that we initialised.
95 void UpdateClasses(); // Update ms_classes
96 void RestoreClasses(); // Removes this library from ms_classes
97 void RegisterModules(); // Init any wxModules in the lib.
98 void UnregisterModules(); // Cleanup any wxModules we installed.
100 wxDECLARE_NO_COPY_CLASS(wxPluginLibrary
);
104 class WXDLLIMPEXP_BASE wxPluginManager
110 static wxPluginLibrary
*LoadLibrary( const wxString
&libname
,
111 int flags
= wxDL_DEFAULT
);
112 static bool UnloadLibrary(const wxString
&libname
);
116 wxPluginManager() : m_entry(NULL
) {}
117 wxPluginManager(const wxString
&libname
, int flags
= wxDL_DEFAULT
)
119 Load(libname
, flags
);
121 ~wxPluginManager() { if ( IsLoaded() ) Unload(); }
123 bool Load(const wxString
&libname
, int flags
= wxDL_DEFAULT
);
126 bool IsLoaded() const { return m_entry
&& m_entry
->IsLoaded(); }
127 void *GetSymbol(const wxString
&symbol
, bool *success
= 0)
129 return m_entry
->GetSymbol( symbol
, success
);
132 static void CreateManifest() { ms_manifest
= new wxDLManifest(wxKEY_STRING
); }
133 static void ClearManifest() { delete ms_manifest
; ms_manifest
= NULL
; }
136 // return the pointer to the entry for the library with given name in
137 // ms_manifest or NULL if none
138 static wxPluginLibrary
*FindByName(const wxString
& name
)
140 const wxDLManifest::iterator i
= ms_manifest
->find(name
);
142 return i
== ms_manifest
->end() ? NULL
: i
->second
;
145 static wxDLManifest
* ms_manifest
; // Static hash of loaded libs.
146 wxPluginLibrary
* m_entry
; // Cache our entry in the manifest.
148 // We could allow this class to be copied if we really
149 // wanted to, but not without modification.
150 wxDECLARE_NO_COPY_CLASS(wxPluginManager
);
154 #endif // wxUSE_DYNAMIC_LOADER
155 #endif // _WX_DYNAMICLOADER_H__