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 const wxClassInfo
*m_before
; // sm_first before loading this lib
86 const wxClassInfo
*m_after
; // ..and after.
88 size_t m_linkcount
; // Ref count of library link calls
89 size_t m_objcount
; // ..and (pluggable) object instantiations.
90 wxModuleList m_wxmodules
; // any wxModules that we initialised.
92 void UpdateClasses(); // Update ms_classes
93 void RestoreClasses(); // Removes this library from ms_classes
94 void RegisterModules(); // Init any wxModules in the lib.
95 void UnregisterModules(); // Cleanup any wxModules we installed.
97 wxDECLARE_NO_COPY_CLASS(wxPluginLibrary
);
101 class WXDLLIMPEXP_BASE wxPluginManager
107 static wxPluginLibrary
*LoadLibrary( const wxString
&libname
,
108 int flags
= wxDL_DEFAULT
);
109 static bool UnloadLibrary(const wxString
&libname
);
113 wxPluginManager() : m_entry(NULL
) {}
114 wxPluginManager(const wxString
&libname
, int flags
= wxDL_DEFAULT
)
116 Load(libname
, flags
);
118 ~wxPluginManager() { if ( IsLoaded() ) Unload(); }
120 bool Load(const wxString
&libname
, int flags
= wxDL_DEFAULT
);
123 bool IsLoaded() const { return m_entry
&& m_entry
->IsLoaded(); }
124 void *GetSymbol(const wxString
&symbol
, bool *success
= 0)
126 return m_entry
->GetSymbol( symbol
, success
);
129 static void CreateManifest() { ms_manifest
= new wxDLManifest(wxKEY_STRING
); }
130 static void ClearManifest() { delete ms_manifest
; ms_manifest
= NULL
; }
133 // return the pointer to the entry for the library with given name in
134 // ms_manifest or NULL if none
135 static wxPluginLibrary
*FindByName(const wxString
& name
)
137 const wxDLManifest::iterator i
= ms_manifest
->find(name
);
139 return i
== ms_manifest
->end() ? NULL
: i
->second
;
142 static wxDLManifest
* ms_manifest
; // Static hash of loaded libs.
143 wxPluginLibrary
* m_entry
; // Cache our entry in the manifest.
145 // We could allow this class to be copied if we really
146 // wanted to, but not without modification.
147 wxDECLARE_NO_COPY_CLASS(wxPluginManager
);
151 #endif // wxUSE_DYNAMIC_LOADER
152 #endif // _WX_DYNAMICLOADER_H__