From a018a119bdcd0fd3d2ba8161c9db3e9b1c6319ff Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Sun, 17 Oct 2004 23:20:51 +0000
Subject: [PATCH] added wxDynamicLibrary::HasSymbol()

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29957 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/changes.txt         |  1 +
 docs/latex/wx/dynlib.tex | 21 ++++++++++++++++++++-
 include/wx/dynlib.h      | 14 ++++++++++++++
 src/common/dynlib.cpp    | 16 ++++++++++------
 4 files changed, 45 insertions(+), 7 deletions(-)

diff --git a/docs/changes.txt b/docs/changes.txt
index 11d97fd2ac..810a821e43 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -205,6 +205,7 @@ OTHER CHANGES
 All:
 
 - Norvegian (Bokmål) translation added (Hans F. Nordhaug)
+- wxDynamicLibrary::HasSymbol() added
 
 All (GUI):
 
diff --git a/docs/latex/wx/dynlib.tex b/docs/latex/wx/dynlib.tex
index 61accb8f3d..59ef7f8a82 100644
--- a/docs/latex/wx/dynlib.tex
+++ b/docs/latex/wx/dynlib.tex
@@ -23,6 +23,7 @@ done in the objects destructor automatically.
 %\helpref{wxDllLoader}{wxdllloader}
 
 
+
 \membersection{wxDynamicLibrary::wxDynamicLibrary}\label{wxdynamiclibrarywxdynamiclibrary}
 
 \func{}{wxDynamicLibrary}{\void}
@@ -31,6 +32,7 @@ done in the objects destructor automatically.
 
 Constructor. Second form calls \helpref{Load}{wxdynamiclibraryload}.
 
+
 \membersection{wxDynamicLibrary::CanonicalizeName}\label{wxdynamiclibrarycanonicalizename}
 
 \func{wxString}{CanonicalizeName}{\param{const wxString\& }{name}, \param{wxDynamicLibraryCategory}{ cat = wxDL\_LIBRARY}}
@@ -51,6 +53,7 @@ The possible values for \arg{cat} are:
 \helpref{CanonicalizePluginName}{wxdynamiclibrarycanonicalizepluginname}
 
 
+
 \membersection{wxDynamicLibrary::CanonicalizePluginName}\label{wxdynamiclibrarycanonicalizepluginname}
 
 \func{wxString}{CanonicalizePluginName}{\param{const wxString\& }{name}, \param{wxPluginCategory}{ cat = wxDL\_PLUGIN\_GUI}}
@@ -68,6 +71,7 @@ The possible values for \arg{cat} are:
     \twocolitem{wxDL\_PLUGIN\_BASE}{plugin which only uses wxBase}
 \end{twocollist}
 
+
 \membersection{wxDynamicLibrary::Detach}\label{wxdynamiclibrarydetach}
 
 \func{wxDllType}{Detach}{\void}
@@ -76,9 +80,10 @@ Detaches this object from its library handle, i.e. the object will not unload
 the library any longer in its destructor but it is now the callers
 responsability to do this using \helpref{Unload}{wxdynamiclibraryunload}.
 
+
 \membersection{wxDynamicLibrary::GetSymbol}\label{wxdynamiclibrarygetsymbol}
 
-\constfunc{void*}{GetSymbol}{\param{const wxString\& }{name}}
+\constfunc{void *}{GetSymbol}{\param{const wxString\& }{name}}
 
 Returns pointer to symbol {\it name} in the library or NULL if the library
 contains no such symbol.
@@ -87,12 +92,25 @@ contains no such symbol.
 
 \helpref{wxDYNLIB\_FUNCTION}{wxdynlibfunction}
 
+
+\membersection{wxDynamicLibrary::HasSymbol}\label{wxdynamiclibraryhassymbol}
+
+\constfunc{bool}{HasSymbol}{\param{const wxString\& }{name}}
+
+Returns \true if the symbol with the given \arg{name} is present in the dynamic
+library, \false otherwise. Unlike \helpref{GetSymbol}{wxdynamiclibrarygetsymbol},
+this function doesn't log an error message if the symbol is not found.
+
+\newsince{2.5.4}
+
+
 \membersection{wxDynamicLibrary::IsLoaded}\label{wxdynamiclibraryisloaded}
 
 \constfunc{bool}{IsLoaded}{\void}
 
 Returns \true if the library was successfully loaded, \false otherwise.
 
+
 \membersection{wxDynamicLibrary::Load}\label{wxdynamiclibraryload}
 
 \func{bool}{Load}{\param{const wxString\& }{name}, \param{int }{flags = wxDL\_DEFAULT}}
@@ -110,6 +128,7 @@ the library name (this is done by default).}
 
 Returns \true if the library was successfully loaded, \false otherwise.
 
+
 \membersection{wxDynamicLibrary::Unload}\label{wxdynamiclibraryunload}
 
 \func{void}{Unload}{\void}
diff --git a/include/wx/dynlib.h b/include/wx/dynlib.h
index 03da571c63..e163ae2098 100644
--- a/include/wx/dynlib.h
+++ b/include/wx/dynlib.h
@@ -151,6 +151,16 @@ public:
     // Return the raw handle from dlopen and friends.
     wxDllType GetLibHandle() const { return m_handle; }
 
+    // check if the given symbol is present in the library, useful to verify if
+    // a loadable module is our plugin, for example, without provoking error
+    // messages from GetSymbol()
+    bool HasSymbol(const wxString& name) const
+    {
+        bool ok;
+        DoGetSymbol(name, &ok);
+        return ok;
+    }
+
     // 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)
@@ -186,6 +196,10 @@ public:
 #endif
 
 protected:
+    // the real implementation of GetSymbol()
+    void *DoGetSymbol(const wxString& name, bool *success = 0) const;
+
+
     // platform specific shared lib suffix.
     static const wxChar *ms_dllext;
 
diff --git a/src/common/dynlib.cpp b/src/common/dynlib.cpp
index ec3c142570..e2d60444ec 100644
--- a/src/common/dynlib.cpp
+++ b/src/common/dynlib.cpp
@@ -314,12 +314,11 @@ void wxDynamicLibrary::Unload(wxDllType handle)
 #endif
 }
 
-void *wxDynamicLibrary::GetSymbol(const wxString &name, bool *success) const
+void *wxDynamicLibrary::DoGetSymbol(const wxString &name, bool *success) const
 {
     wxCHECK_MSG( IsLoaded(), NULL,
                  _T("Can't load symbol from unloaded library") );
 
-    bool     failed = false;
     void    *symbol = 0;
 
     wxUnusedVar(symbol);
@@ -360,6 +359,15 @@ void *wxDynamicLibrary::GetSymbol(const wxString &name, bool *success) const
 #error  "runtime shared lib support not implemented"
 #endif
 
+    if ( success )
+        *success = symbol != NULL;
+
+    return symbol;
+}
+
+void *wxDynamicLibrary::GetSymbol(const wxString& name, bool *success) const
+{
+    void *symbol = DoGetSymbol(name, success);
     if ( !symbol )
     {
 #if defined(HAVE_DLERROR) && !defined(__EMX__)
@@ -376,18 +384,14 @@ void *wxDynamicLibrary::GetSymbol(const wxString &name, bool *success) const
             wxLogError(wxT("%s"), err);
         }
 #else
-        failed = true;
         wxLogSysError(_("Couldn't find symbol '%s' in a dynamic library"),
                       name.c_str());
 #endif
     }
-    if( success )
-        *success = !failed;
 
     return symbol;
 }
 
-
 /*static*/
 wxString
 wxDynamicLibrary::CanonicalizeName(const wxString& name,
-- 
2.50.0

