/////////////////////////////////////////////////////////////////////////////
-// Name: dynload.h
+// Name: wx/dynload.h
// Purpose: Dynamic loading framework
// Author: Ron Lee, David Falkinder, Vadim Zeitlin and a cast of 1000's
// (derived in part from dynlib.cpp (c) 1998 Guilhem Lavaux)
// Created: 03/12/01
// RCS-ID: $Id$
// Copyright: (c) 2001 Ron Lee <ron@debian.org>
-// Licence: wxWindows license
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_DYNAMICLOADER_H__
#define _WX_DYNAMICLOADER_H__
-#ifdef __GNUG__
-#pragma interface "dynload.h"
-#endif
-
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#if wxUSE_DYNAMIC_LOADER
-#include "wx/hash.h"
+#include "wx/dynlib.h"
+#include "wx/hashmap.h"
#include "wx/module.h"
-// FIXME: can this go in private.h or something too??
-#if defined(__WXPM__) || defined(__EMX__)
-#define INCL_DOS
-#include <os2.h>
-#endif
-
-#ifdef __WXMSW__
-#include "wx/msw/private.h"
-#endif
-
-// Ugh, I'd much rather this was typesafe, but no time
-// to rewrite wxHashTable right now..
-
-typedef wxHashTable wxDLManifest;
-typedef wxHashTable wxDLImports;
-
-// ----------------------------------------------------------------------------
-// conditional compilation
-// ----------------------------------------------------------------------------
-
- // Note: WXPM/EMX has to be tested first, since we want to use
- // native version, even if configure detected presence of DLOPEN.
-
-#if defined(__WXPM__) || defined(__EMX__) || defined(__WINDOWS__)
-typedef HMODULE wxDllType;
-#elif defined(HAVE_DLOPEN)
-#include <dlfcn.h>
-typedef void *wxDllType;
-#elif defined(HAVE_SHL_LOAD)
-#include <dl.h>
-typedef shl_t wxDllType;
-#elif defined(__DARWIN__)
-typedef void *wxDllType;
-#elif defined(__WXMAC__)
-typedef CFragConnectionID wxDllType;
-#else
-#error "Dynamic Loading classes can't be compiled on this platform, sorry."
-#endif
-
-
-// ---------------------------------------------------------------------------
-// wxDynamicLibrary
-// ---------------------------------------------------------------------------
-
-//FIXME: This class isn't really common at all, it should be moved
-// into platform dependent files.
-
-// NOTE: this class is (deliberately) not virtual, do not attempt
-// to use it polymorphically.
-
-enum wxDLFlags
-{
- wxDL_LAZY = 0x00000001, // resolve undefined symbols at first use
- wxDL_NOW = 0x00000002, // resolve undefined symbols on load
- wxDL_GLOBAL = 0x00000004, // export extern symbols to subsequently
- // loaded libs.
- wxDL_VERBATIM = 0x00000008, // Attempt to load the supplied library
- // name without appending the usual dll
- // filename extension.
-#ifdef __osf__
- wxDL_DEFAULT = wxDL_LAZY
-#else
- wxDL_DEFAULT = wxDL_LAZY | wxDL_GLOBAL
-#endif
-};
-
-
-class WXDLLEXPORT wxDynamicLibrary
-{
-public:
-
- // return a valid handle for the main program itself or NULL if
- // back linking is not supported by the current platform (e.g. Win32)
-
- static wxDllType GetProgramHandle();
-
- // return the platform standard DLL extension (with leading dot)
-
- static const wxString &GetDllExt() { return ms_dllext; }
-
- wxDynamicLibrary() : m_handle(0) {}
- wxDynamicLibrary(wxString libname, int flags = wxDL_DEFAULT)
- : m_handle(0)
- {
- Load(libname, flags);
- }
- ~wxDynamicLibrary() { Unload(); }
-
- // return TRUE if the library was loaded successfully
-
- bool IsLoaded() const { return m_handle != 0; }
-
- // load the library with the given name
- // (full or not), return TRUE on success
-
- bool Load(wxString libname, int flags = wxDL_DEFAULT);
-
- // unload the library, also done automatically in dtor
-
- void Unload();
+class WXDLLIMPEXP_FWD_BASE wxPluginLibrary;
- // Return the raw handle from dlopen and friends.
-
- wxDllType GetLibHandle() const { return m_handle; }
-
- // resolve a symbol in a loaded DLL, such as a variable or function
- // name. 'name' is the (possibly mangled) name of the symbol.
- // (use extern "C" to export unmangled names)
- //
- // Since it is perfectly valid for the returned symbol to actually be
- // NULL, that is not always indication of an error. Pass and test the
- // parameter 'success' for a true indication of success or failure to
- // load the symbol.
- //
- // Returns a pointer to the symbol on success, or NULL if an error
- // occurred or the symbol wasn't found.
-
- void *GetSymbol(const wxString& name, bool *success = 0) const;
-
-#if WXWIN_COMPATIBILITY_2_2
- operator bool() const { return IsLoaded(); }
-#endif
-
-protected:
-
- // Platform specific shared lib suffix.
-
- static const wxString ms_dllext;
-
- // the handle to DLL or NULL
-
- wxDllType m_handle;
-
- // no copy ctor/assignment operators
- // or we'd try to unload the library twice
-
-DECLARE_NO_COPY_CLASS(wxDynamicLibrary)
-};
+WX_DECLARE_STRING_HASH_MAP_WITH_DECL(wxPluginLibrary *, wxDLManifest,
+ class WXDLLIMPEXP_BASE);
+typedef wxDLManifest wxDLImports;
// ---------------------------------------------------------------------------
// wxPluginLibrary
// instantiate this class directly anyway, use wxPluginManager
// instead.
-class WXDLLEXPORT wxPluginLibrary : public wxDynamicLibrary
+class WXDLLIMPEXP_BASE wxPluginLibrary : public wxDynamicLibrary
{
public:
- static wxDLImports ms_classes; // Static hash of all imported classes.
+ static wxDLImports* ms_classes; // Static hash of all imported classes.
wxPluginLibrary( const wxString &libname, int flags = wxDL_DEFAULT );
~wxPluginLibrary();
- wxPluginLibrary *RefLib() { ++m_linkcount; return this; }
+ wxPluginLibrary *RefLib();
bool UnrefLib();
// These two are called by the PluginSentinel on (PLUGGABLE) object
void RefObj() { ++m_objcount; }
void UnrefObj()
{
- wxASSERT_MSG( m_objcount > 0, _T("Too many objects deleted??") );
+ wxASSERT_MSG( m_objcount > 0, wxT("Too many objects deleted??") );
--m_objcount;
}
private:
- wxClassInfo *m_before; // sm_first before loading this lib
- wxClassInfo *m_after; // ..and after.
+ // These pointers may be NULL but if they are not, then m_ourLast follows
+ // m_ourFirst in the linked list, i.e. can be found by calling GetNext() a
+ // sufficient number of times.
+ const wxClassInfo *m_ourFirst; // first class info in this plugin
+ const wxClassInfo *m_ourLast; // ..and the last one
size_t m_linkcount; // Ref count of library link calls
size_t m_objcount; // ..and (pluggable) object instantiations.
wxModuleList m_wxmodules; // any wxModules that we initialised.
- void UpdateClassInfo(); // Update the wxClassInfo table
- void RestoreClassInfo(); // Restore the original wxClassInfo state.
+ void UpdateClasses(); // Update ms_classes
+ void RestoreClasses(); // Removes this library from ms_classes
void RegisterModules(); // Init any wxModules in the lib.
void UnregisterModules(); // Cleanup any wxModules we installed.
-DECLARE_NO_COPY_CLASS(wxPluginLibrary)
+ wxDECLARE_NO_COPY_CLASS(wxPluginLibrary);
};
-class WXDLLEXPORT wxPluginManager
+class WXDLLIMPEXP_BASE wxPluginManager
{
public:
int flags = wxDL_DEFAULT );
static bool UnloadLibrary(const wxString &libname);
- // This is used by wxDllLoader. It's wrapped in the compatibility
- // macro because it's of arguable use outside of that.
-
-#if WXWIN_COMPATIBILITY_2_2
- static wxPluginLibrary *GetObjectFromHandle(wxDllType handle);
-#endif
-
// Instance methods.
- wxPluginManager() : m_entry(0) {};
+ wxPluginManager() : m_entry(NULL) {}
wxPluginManager(const wxString &libname, int flags = wxDL_DEFAULT)
{
Load(libname, flags);
}
- ~wxPluginManager() { Unload(); }
+ ~wxPluginManager() { if ( IsLoaded() ) Unload(); }
bool Load(const wxString &libname, int flags = wxDL_DEFAULT);
void Unload();
return m_entry->GetSymbol( symbol, success );
}
+ static void CreateManifest() { ms_manifest = new wxDLManifest(wxKEY_STRING); }
+ static void ClearManifest() { delete ms_manifest; ms_manifest = NULL; }
+
private:
+ // return the pointer to the entry for the library with given name in
+ // ms_manifest or NULL if none
+ static wxPluginLibrary *FindByName(const wxString& name)
+ {
+ const wxDLManifest::iterator i = ms_manifest->find(name);
+
+ return i == ms_manifest->end() ? NULL : i->second;
+ }
- static wxDLManifest ms_manifest; // Static hash of loaded libs.
- wxPluginLibrary *m_entry; // Cache our entry in the manifest.
+ static wxDLManifest* ms_manifest; // Static hash of loaded libs.
+ wxPluginLibrary* m_entry; // Cache our entry in the manifest.
// We could allow this class to be copied if we really
// wanted to, but not without modification.
-
-DECLARE_NO_COPY_CLASS(wxPluginManager)
-};
-
-
-// ---------------------------------------------------------------------------
-// wxDllLoader
-// ---------------------------------------------------------------------------
-
- // Cross platform wrapper for dlopen and friends.
- // There are no instances of this class, it simply
- // serves as a namespace for its static member functions.
-
-#if WXWIN_COMPATIBILITY_2_2
-class WXDLLEXPORT wxDllLoader
-{
-public:
-
- static wxDllType LoadLibrary(const wxString& name);
- static void UnloadLibrary(wxDllType dll);
-
- static wxDllType GetProgramHandle() { return wxDynamicLibrary::GetProgramHandle(); }
-
- static void *GetSymbol(wxDllType dllHandle, const wxString &name, bool *success = 0);
-
- static const wxString &GetDllExt() { return wxDynamicLibrary::GetDllExt(); }
-
-private:
-
- wxDllLoader(); // forbid construction of objects
+ wxDECLARE_NO_COPY_CLASS(wxPluginManager);
};
-#endif
#endif // wxUSE_DYNAMIC_LOADER
#endif // _WX_DYNAMICLOADER_H__
-// vi:sts=4:sw=4:et