initial commit
Signed-off-by: Peter Siegmund <mars3142@noreply.mars3142.dev>
This commit is contained in:
154
libs/wxWidgets-3.3.1/include/wx/dynload.h
Normal file
154
libs/wxWidgets-3.3.1/include/wx/dynload.h
Normal file
@@ -0,0 +1,154 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// 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
|
||||
// Copyright: (c) 2001 Ron Lee <ron@debian.org>
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _WX_DYNAMICLOADER_H__
|
||||
#define _WX_DYNAMICLOADER_H__
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// headers
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#include "wx/defs.h"
|
||||
|
||||
#if wxUSE_DYNAMIC_LOADER
|
||||
|
||||
#include "wx/dynlib.h"
|
||||
#include "wx/module.h"
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
class WXDLLIMPEXP_FWD_BASE wxPluginLibrary;
|
||||
|
||||
using wxDLManifest = std::unordered_map<wxString, wxPluginLibrary*>;
|
||||
|
||||
typedef wxDLManifest wxDLImports;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// wxPluginLibrary
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
// NOTE: Do not attempt to use a base class pointer to this class.
|
||||
// wxDL is not virtual and we deliberately hide some of its
|
||||
// methods here.
|
||||
//
|
||||
// Unless you know exactly why you need to, you probably shouldn't
|
||||
// instantiate this class directly anyway, use wxPluginManager
|
||||
// instead.
|
||||
|
||||
class WXDLLIMPEXP_BASE wxPluginLibrary : public wxDynamicLibrary
|
||||
{
|
||||
public:
|
||||
|
||||
static wxDLImports* ms_classes; // Static hash of all imported classes.
|
||||
|
||||
wxPluginLibrary( const wxString &libname, int flags = wxDL_DEFAULT );
|
||||
~wxPluginLibrary();
|
||||
|
||||
wxPluginLibrary *RefLib();
|
||||
bool UnrefLib();
|
||||
|
||||
// These two are called by the PluginSentinel on (PLUGGABLE) object
|
||||
// creation/destruction. There is usually no reason for the user to
|
||||
// call them directly. We have to separate this from the link count,
|
||||
// since the two are not interchangeable.
|
||||
|
||||
// FIXME: for even better debugging PluginSentinel should register
|
||||
// the name of the class created too, then we can state
|
||||
// exactly which object was not destroyed which may be
|
||||
// difficult to find otherwise. Also this code should
|
||||
// probably only be active in DEBUG mode, but let's just
|
||||
// get it right first.
|
||||
|
||||
void RefObj() { ++m_objcount; }
|
||||
void UnrefObj()
|
||||
{
|
||||
wxASSERT_MSG( m_objcount > 0, wxT("Too many objects deleted??") );
|
||||
--m_objcount;
|
||||
}
|
||||
|
||||
// Override/hide some base class methods
|
||||
|
||||
bool IsLoaded() const { return m_linkcount > 0; }
|
||||
void Unload() { UnrefLib(); }
|
||||
|
||||
private:
|
||||
|
||||
// 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 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.
|
||||
|
||||
wxDECLARE_NO_COPY_CLASS(wxPluginLibrary);
|
||||
};
|
||||
|
||||
|
||||
class WXDLLIMPEXP_BASE wxPluginManager
|
||||
{
|
||||
public:
|
||||
|
||||
// Static accessors.
|
||||
|
||||
static wxPluginLibrary *LoadLibrary( const wxString &libname,
|
||||
int flags = wxDL_DEFAULT );
|
||||
static bool UnloadLibrary(const wxString &libname);
|
||||
|
||||
// Instance methods.
|
||||
|
||||
wxPluginManager() : m_entry(nullptr) {}
|
||||
wxPluginManager(const wxString &libname, int flags = wxDL_DEFAULT)
|
||||
{
|
||||
Load(libname, flags);
|
||||
}
|
||||
~wxPluginManager() { if ( IsLoaded() ) Unload(); }
|
||||
|
||||
bool Load(const wxString &libname, int flags = wxDL_DEFAULT);
|
||||
void Unload();
|
||||
|
||||
bool IsLoaded() const { return m_entry && m_entry->IsLoaded(); }
|
||||
void* GetSymbol(const wxString& symbol, bool* success = nullptr)
|
||||
{
|
||||
return m_entry->GetSymbol( symbol, success );
|
||||
}
|
||||
|
||||
static void CreateManifest() { ms_manifest = new wxDLManifest(); }
|
||||
static void ClearManifest() { delete ms_manifest; ms_manifest = nullptr; }
|
||||
|
||||
private:
|
||||
// return the pointer to the entry for the library with given name in
|
||||
// ms_manifest or nullptr if none
|
||||
static wxPluginLibrary *FindByName(const wxString& name)
|
||||
{
|
||||
const wxDLManifest::iterator i = ms_manifest->find(name);
|
||||
|
||||
return i == ms_manifest->end() ? nullptr : i->second;
|
||||
}
|
||||
|
||||
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.
|
||||
wxDECLARE_NO_COPY_CLASS(wxPluginManager);
|
||||
};
|
||||
|
||||
|
||||
#endif // wxUSE_DYNAMIC_LOADER
|
||||
#endif // _WX_DYNAMICLOADER_H__
|
||||
|
||||
Reference in New Issue
Block a user