]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/gnome/gvfs.cpp
Add some version checks to help compiling on OSX.
[wxWidgets.git] / src / gtk / gnome / gvfs.cpp
index db197126e252afcd754df4c1247c879c55c30c11..37c2b6c175c39def6e334e39ddb794dd5026331c 100644 (file)
     #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 <libgnomevfs/gnome-vfs-mime-handlers.h>
 
-#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