#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
#if wxUSE_DYNAMIC_LOADER
#ifdef __WINDOWS__
-#include "wx/msw/private.h"
+ #include "wx/msw/private.h"
#endif
#ifndef WX_PRECOMP
-#include "wx/log.h"
-#include "wx/intl.h"
+ #include "wx/log.h"
+ #include "wx/intl.h"
#endif
-#include "wx/dynload.h"
+#include "wx/filename.h" // for SplitPath()
+#include "wx/dynload.h"
+#include "wx/module.h"
+
+#if defined(__DARWIN__)
+/* Porting notes:
+ * The dlopen port is a port from dl_next.xs by Anno Siegel.
+ * dl_next.xs is itself a port from dl_dlopen.xs by Paul Marquess.
+ * The method used here is just to supply the sun style dlopen etc.
+ * functions in terms of Darwin NS*.
+ */
+void *dlopen(const char *path, int mode /* mode is ignored */);
+void *dlsym(void *handle, const char *symbol);
+int dlclose(void *handle);
+const char *dlerror(void);
+#endif
// ============================================================================
// implementation
{
wxASSERT_MSG(m_handle == 0, _T("Library already loaded."));
- if( !(flags & wxDL_VERBATIM) )
- libname += GetDllExt();
+ // add the proper extension for the DLL ourselves unless told not to
+ if ( !(flags & wxDL_VERBATIM) )
+ {
+ // and also check that the libname doesn't already have it
+ wxString ext;
+ wxFileName::SplitPath(libname, NULL, NULL, &ext);
+ if ( ext.empty() )
+ {
+ libname += GetDllExt();
+ }
+ }
-#if defined(__WXMAC__) && !defined(__UNIX__)
+#if defined(__WXMAC__) && !defined(__DARWIN__)
FSSpec myFSSpec;
Ptr myMainAddr;
Str255 myErrName;
#elif defined(__WXPM__) || defined(__EMX__)
char err[256] = "";
- DosLoadModule(err, sizeof(err), libname.c_str(), &m_handle)
+ DosLoadModule(err, sizeof(err), libname.c_str(), &m_handle);
-#elif defined(HAVE_DLOPEN)
+#elif defined(HAVE_DLOPEN) || defined(__DARWIN__)
-#ifdef __VMS
+#if defined(__VMS) || defined(__DARWIN__)
m_handle = dlopen(libname.c_str(), 0); // The second parameter is ignored
#else
int rtldFlags = 0;
}
m_handle = dlopen(libname.c_str(), rtldFlags);
-#endif // __VMS
+#endif // __VMS || __DARWIN__
#elif defined(HAVE_SHL_LOAD)
int shlFlags = 0;
}
m_handle = shl_load(libname.c_str(), BIND_DEFERRED, 0);
-#elif defined(__DARWIN__)
- NSObjectFileImage ofile;
- int dyld_result = NSCreateObjectFileImageFromFile(libname.c_str(), &ofile);
-
- if (dyld_result != NSObjectFileImageSuccess)
- {
- TranslateError(libname.c_str(), OFImage, dyld_result);
- }
- else
- {
- // NSLinkModule will cause the run to abort on any link error's
- // not very friendly but the error recovery functionality is limited.
- m_handle = NSLinkModule(ofile, libname.c_str(), TRUE);
- }
-
#elif defined(__WINDOWS__)
m_handle = ::LoadLibrary(libname.c_str());
if ( m_handle == 0 )
{
wxString msg(_("Failed to load shared library '%s'"));
-#ifdef HAVE_DLERROR
+#if defined(HAVE_DLERROR) && !defined(__EMX__)
const wxChar *err = dlerror();
if( err )
wxLogError( msg, err );
{
#if defined(__WXPM__) || defined(__EMX__)
DosFreeModule( m_handle );
-#elif defined(HAVE_DLOPEN)
+#elif defined(HAVE_DLOPEN) || defined(__DARWIN__)
dlclose( m_handle );
#elif defined(HAVE_SHL_LOAD)
shl_unload( m_handle );
#elif defined(__WINDOWS__)
::FreeLibrary( m_handle );
-#elif defined(__WXMAC__)
- CloseConnection( &m_handle );
+#elif defined(__WXMAC__) && !defined(__DARWIN__)
+ CloseConnection( (CFragConnectionID*) &m_handle );
#else
#error "runtime shared lib support not implemented"
#endif
bool failed = FALSE;
void *symbol = 0;
-#if defined(__WXMAC__) && !defined(__UNIX__)
+#if defined(__WXMAC__) && !defined(__DARWIN__)
Ptr symAddress;
CFragSymbolClass symClass;
Str255 symName;
#elif defined(__WXPM__) || defined(__EMX__)
DosQueryProcAddr( m_handle, 1L, name.c_str(), (PFN*)symbol );
-#elif defined(HAVE_DLOPEN)
+#elif defined(HAVE_DLOPEN) || defined(__DARWIN__)
symbol = dlsym( m_handle, name.c_str() );
#elif defined(HAVE_SHL_LOAD)
if( shl_findsym( &m_handle, name.c_str(), TYPE_UNDEFINED, &symbol ) != 0 )
symbol = 0;
-#elif defined(__DARWIN__)
- if( NSIsSymbolNameDefined( name.c_str() ) )
- symbol = NSAddressOfSymbol( NSLookupAndBindSymbol( name.c_str() ) );
-
#elif defined(__WINDOWS__)
- symbol = ::GetProcAddress( m_handle, name.mb_str() );
+ symbol = (void*) ::GetProcAddress( m_handle, name.mb_str() );
#else
#error "runtime shared lib support not implemented"
if ( !symbol )
{
wxString msg(_("wxDynamicLibrary failed to GetSymbol '%s'"));
-#ifdef HAVE_DLERROR
+#if defined(HAVE_DLERROR) && !defined(__EMX__)
const wxChar *err = dlerror();
if( err )
{
// ---------------------------------------------------------------------------
-wxDLImports wxPluginLibrary::ms_classes(wxKEY_STRING);
+wxDLImports* wxPluginLibrary::ms_classes = NULL;
+
+class wxPluginLibraryModule : public wxModule
+{
+public:
+ wxPluginLibraryModule() {}
+ bool OnInit() { wxPluginLibrary::ms_classes = new wxDLImports(wxKEY_STRING); wxPluginManager::CreateManifest(); return TRUE; }
+ void OnExit() { delete wxPluginLibrary::ms_classes; wxPluginLibrary::ms_classes = NULL;
+ wxPluginManager::ClearManifest(); }
+
+private:
+ DECLARE_DYNAMIC_CLASS(wxPluginLibraryModule )
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxPluginLibraryModule, wxModule)
+
wxPluginLibrary::wxPluginLibrary(const wxString &libname, int flags)
: m_linkcount(1)
// Hash all the class names into a local table too so
// we can quickly find the entry they correspond to.
- if( ms_classes.Get(info->m_className) == 0 )
- ms_classes.Put(info->m_className, (wxObject *) this);
+ if( ms_classes->Get(info->m_className) == 0 )
+ ms_classes->Put(info->m_className, (wxObject *) this);
}
}
for(info = m_after; info != m_before; info = info->m_next)
{
wxClassInfo::sm_classTable->Delete(info->m_className);
- ms_classes.Delete(info->m_className);
+ ms_classes->Delete(info->m_className);
}
if( wxClassInfo::sm_first == m_after )
// wxPluginLibrary
// ---------------------------------------------------------------------------
-wxDLManifest wxPluginManager::ms_manifest(wxKEY_STRING);
+wxDLManifest* wxPluginManager::ms_manifest = NULL;
// ------------------------
// Static accessors
if( !(flags & wxDL_VERBATIM) )
realname += wxDynamicLibrary::GetDllExt();
- wxPluginLibrary *entry = (wxPluginLibrary*) ms_manifest.Get(realname);
+ wxPluginLibrary *entry = (wxPluginLibrary*) ms_manifest->Get(realname);
if( entry != 0 )
{
if( entry->IsLoaded() )
{
- ms_manifest.Put(realname, (wxObject*) entry);
+ ms_manifest->Put(realname, (wxObject*) entry);
}
else
{
bool wxPluginManager::UnloadLibrary(const wxString &libname)
{
- wxPluginLibrary *entry = (wxPluginLibrary*) ms_manifest.Get(libname);
+ wxPluginLibrary *entry = (wxPluginLibrary*) ms_manifest->Get(libname);
if( !entry )
- entry = (wxPluginLibrary*) ms_manifest.Get(libname + wxDynamicLibrary::GetDllExt());
+ entry = (wxPluginLibrary*) ms_manifest->Get(libname + wxDynamicLibrary::GetDllExt());
if( entry )
return entry->UnrefLib();
wxPluginLibrary *wxPluginManager::GetObjectFromHandle(wxDllType handle)
{
wxNode *node;
- ms_manifest.BeginFind();
+ ms_manifest->BeginFind();
- for(node = ms_manifest.Next(); node; node = ms_manifest.Next())
+ for(node = ms_manifest->Next(); node; node = ms_manifest->Next())
if( ((wxPluginLibrary*)node->GetData())->GetLibHandle() == handle )
return (wxPluginLibrary*)node->GetData();
void wxPluginManager::Unload()
{
wxNode *node;
- ms_manifest.BeginFind();
+ ms_manifest->BeginFind();
// It's either this or store the name of the lib just to do this.
- for(node = ms_manifest.Next(); node; node = ms_manifest.Next())
+ for(node = ms_manifest->Next(); node; node = ms_manifest->Next())
if( (wxPluginLibrary*)node->GetData() == m_entry )
break;
}
}
-
-#ifdef __DARWIN__
-// ---------------------------------------------------------------------------
-// For Darwin/Mac OS X
-// supply the sun style dlopen functions in terms of Darwin NS*
-// ---------------------------------------------------------------------------
-
-extern "C" {
-#import <mach-o/dyld.h>
-};
-
-enum dyldErrorSource
-{
- OFImage,
-};
-
-static char dl_last_error[1024];
-
-static void TranslateError(const char *path, enum dyldErrorSource type, int number)
-{
- unsigned int index;
- static char *OFIErrorStrings[] =
- {
- "%s(%d): Object Image Load Failure\n",
- "%s(%d): Object Image Load Success\n",
- "%s(%d): Not an recognisable object file\n",
- "%s(%d): No valid architecture\n",
- "%s(%d): Object image has an invalid format\n",
- "%s(%d): Invalid access (permissions?)\n",
- "%s(%d): Unknown error code from NSCreateObjectFileImageFromFile\n",
- };
-#define NUM_OFI_ERRORS (sizeof(OFIErrorStrings) / sizeof(OFIErrorStrings[0]))
-
- switch (type)
- {
- case OFImage:
- index = number;
- if (index > NUM_OFI_ERRORS - 1) {
- index = NUM_OFI_ERRORS - 1;
- }
- sprintf(dl_last_error, OFIErrorStrings[index], path, number);
- break;
-
- default:
- sprintf(dl_last_error, "%s(%d): Totally unknown error type %d\n",
- path, number, type);
- break;
- }
-}
-
-#endif // __DARWIN__
-
-
// ---------------------------------------------------------------------------
// wxDllLoader (all these methods are static)
// ---------------------------------------------------------------------------