X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1d115baf4b55f601d34b6f7d8a30d0a905545418..e87d78bb36f371d593137761158118fb09b69fa2:/src/gtk/gnome/gvfs.cpp diff --git a/src/gtk/gnome/gvfs.cpp b/src/gtk/gnome/gvfs.cpp index db197126e2..37c2b6c175 100644 --- a/src/gtk/gnome/gvfs.cpp +++ b/src/gtk/gnome/gvfs.cpp @@ -15,75 +15,70 @@ #pragma hdrstop #endif +#if wxUSE_MIMETYPE && wxUSE_LIBGNOMEVFS + #include "wx/gtk/gnome/gvfs.h" -#if wxUSE_MIMETYPE && wxUSE_LIBGNOMEVFS +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/module.h" +#endif #include "wx/mimetype.h" -#include "wx/gtk/private.h" -#include "wx/module.h" #include "wx/dynlib.h" -#include "wx/log.h" #include -#include "wx/html/forcelnk.h" -FORCE_LINK_ME(gnome_vfs) +#include "wx/link.h" +wxFORCE_LINK_THIS_MODULE(gnome_vfs) //---------------------------------------------------------------------------- // wxGnomeVFSLibrary //---------------------------------------------------------------------------- -#define wxDL_METHOD_DEFINE( rettype, name, args, shortargs, defret ) \ - typedef rettype (* name ## Type) args ; \ - name ## Type pfn_ ## name; \ - rettype name args \ - { if (m_ok) return pfn_ ## name shortargs ; return defret; } - -#define wxDL_METHOD_LOAD( lib, name, success ) \ - pfn_ ## name = (name ## Type) lib->GetSymbol( wxT(#name), &success ); \ - if (!success) return; - class wxGnomeVFSLibrary { public: wxGnomeVFSLibrary(); ~wxGnomeVFSLibrary(); - bool IsOk(); - void InitializeMethods(); private: - bool m_ok; - wxDynamicLibrary *m_gnome_vfs_lib; + bool InitializeMethods(); + + wxDynamicLibrary m_libGnomeVFS; + + // only true if we successfully loaded the library above + // + // don't rename this field, it's used by wxDL_XXX macros internally + bool m_ok; public: wxDL_METHOD_DEFINE( gboolean, gnome_vfs_init, (), (), FALSE ) - wxDL_METHOD_DEFINE( void, gnome_vfs_shutdown, - (), (), /**/ ) - + wxDL_VOIDMETHOD_DEFINE( gnome_vfs_shutdown, + (), () ) + wxDL_METHOD_DEFINE( GnomeVFSResult, gnome_vfs_mime_set_icon, (const char *mime_type, const char *filename), (mime_type, filename), GNOME_VFS_OK ) }; wxGnomeVFSLibrary::wxGnomeVFSLibrary() { - m_gnome_vfs_lib = NULL; - wxLogNull log; - m_gnome_vfs_lib = new wxDynamicLibrary( wxT("libgnomevfs-2.so.0") ); - m_ok = m_gnome_vfs_lib->IsLoaded(); - if (!m_ok) return; - - InitializeMethods(); + m_libGnomeVFS.Load("libgnomevfs-2.so.0"); + m_ok = m_libGnomeVFS.IsLoaded() && InitializeMethods(); } wxGnomeVFSLibrary::~wxGnomeVFSLibrary() { - if (m_gnome_vfs_lib) - delete m_gnome_vfs_lib; + // we crash on exit later (i.e. after main() finishes) if we unload this + // library, apparently it inserts some hooks in other libraries to which we + // link implicitly (GTK+ itself?) which are not uninstalled when it's + // unloaded resulting in this crash, so just leave it in memory -- it's a + // lesser evil + m_libGnomeVFS.Detach(); } bool wxGnomeVFSLibrary::IsOk() @@ -91,15 +86,12 @@ bool wxGnomeVFSLibrary::IsOk() return m_ok; } -void wxGnomeVFSLibrary::InitializeMethods() +bool wxGnomeVFSLibrary::InitializeMethods() { - m_ok = false; - bool success; + wxDL_METHOD_LOAD( m_libGnomeVFS, gnome_vfs_init ); + wxDL_METHOD_LOAD( m_libGnomeVFS, gnome_vfs_shutdown ); - wxDL_METHOD_LOAD( m_gnome_vfs_lib, gnome_vfs_init, success ) - wxDL_METHOD_LOAD( m_gnome_vfs_lib, gnome_vfs_shutdown, success ) - - m_ok = true; + return true; } static wxGnomeVFSLibrary* gs_lgvfs = NULL; @@ -124,18 +116,15 @@ bool wxGnomeVFSMimeTypesManagerImpl::DoAssociation(const wxString& strType, const wxArrayString& strExtensions, const wxString& strDesc) { - int nIndex = AddToMimeData(strType, strIcon, entry, strExtensions, strDesc, true); - - if ( nIndex == wxNOT_FOUND ) - return false; - - if (m_mailcapStylesInited & wxMAILCAP_GNOME) - { - // User modificationt to the MIME database - // are not supported :-) - } - - return false; + return AddToMimeData + ( + strType, + strIcon, + entry, + strExtensions, + strDesc, + true + ) != wxNOT_FOUND; } //---------------------------------------------------------------------------- @@ -159,7 +148,7 @@ bool wxGnomeVFSModule::OnInit() if (gs_lgvfs->IsOk()) { if (gs_lgvfs->gnome_vfs_init()) - wxMimeTypesManagerFactory::SetFactory( new wxGnomeVFSMimeTypesManagerFactory ); + wxMimeTypesManagerFactory::Set( new wxGnomeVFSMimeTypesManagerFactory ); } return true; } @@ -168,12 +157,10 @@ void wxGnomeVFSModule::OnExit() { if (gs_lgvfs->IsOk()) gs_lgvfs->gnome_vfs_shutdown(); - + delete gs_lgvfs; } IMPLEMENT_DYNAMIC_CLASS(wxGnomeVFSModule, wxModule) -#endif - // wxUSE_LIBGNOMEVS - // wxUSE_MIMETYPE +#endif // wxUSE_LIBGNOMEVFS && wxUSE_MIMETYPE