Rearrange code to make adding wxMimeTypesManagerFactory
at runtim possible. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38172 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -938,6 +938,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
|
|||||||
src/gtk/frame.cpp
|
src/gtk/frame.cpp
|
||||||
src/gtk/gauge.cpp
|
src/gtk/gauge.cpp
|
||||||
src/gtk/gnome/gprint.cpp
|
src/gtk/gnome/gprint.cpp
|
||||||
|
src/gtk/gnome/gvfs.cpp
|
||||||
src/gtk/listbox.cpp
|
src/gtk/listbox.cpp
|
||||||
src/gtk/mdi.cpp
|
src/gtk/mdi.cpp
|
||||||
src/gtk/menu.cpp
|
src/gtk/menu.cpp
|
||||||
@@ -982,6 +983,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
|
|||||||
wx/gtk/frame.h
|
wx/gtk/frame.h
|
||||||
wx/gtk/gauge.h
|
wx/gtk/gauge.h
|
||||||
wx/gtk/gnome/gprint.h
|
wx/gtk/gnome/gprint.h
|
||||||
|
wx/gtk/gnome/gvfs.h
|
||||||
wx/gtk/listbox.h
|
wx/gtk/listbox.h
|
||||||
wx/gtk/mdi.h
|
wx/gtk/mdi.h
|
||||||
wx/gtk/menu.h
|
wx/gtk/menu.h
|
||||||
|
29
configure.in
29
configure.in
@@ -401,6 +401,7 @@ if test $DEBUG_CONFIGURE = 1; then
|
|||||||
DEFAULT_wxUSE_LIBMSPACK=no
|
DEFAULT_wxUSE_LIBMSPACK=no
|
||||||
DEFAULT_wxUSE_LIBSDL=no
|
DEFAULT_wxUSE_LIBSDL=no
|
||||||
DEFAULT_wxUSE_LIBGNOMEPRINT=no
|
DEFAULT_wxUSE_LIBGNOMEPRINT=no
|
||||||
|
DEFAULT_wxUSE_LIBGNOMEVFS=no
|
||||||
DEFAULT_wxUSE_LIBHILDON=no
|
DEFAULT_wxUSE_LIBHILDON=no
|
||||||
DEFAULT_wxUSE_ODBC=no
|
DEFAULT_wxUSE_ODBC=no
|
||||||
DEFAULT_wxUSE_OPENGL=no
|
DEFAULT_wxUSE_OPENGL=no
|
||||||
@@ -604,6 +605,7 @@ else
|
|||||||
DEFAULT_wxUSE_LIBMSPACK=yes
|
DEFAULT_wxUSE_LIBMSPACK=yes
|
||||||
DEFAULT_wxUSE_LIBSDL=no
|
DEFAULT_wxUSE_LIBSDL=no
|
||||||
DEFAULT_wxUSE_LIBGNOMEPRINT=no
|
DEFAULT_wxUSE_LIBGNOMEPRINT=no
|
||||||
|
DEFAULT_wxUSE_LIBGNOMEVFS=no
|
||||||
DEFAULT_wxUSE_LIBHILDON=no
|
DEFAULT_wxUSE_LIBHILDON=no
|
||||||
DEFAULT_wxUSE_ODBC=no
|
DEFAULT_wxUSE_ODBC=no
|
||||||
DEFAULT_wxUSE_OPENGL=no
|
DEFAULT_wxUSE_OPENGL=no
|
||||||
@@ -830,7 +832,8 @@ WX_ARG_SYS_WITH(libtiff, [ --with-libtiff use libtiff (TIFF file for
|
|||||||
WX_ARG_SYS_WITH(libxpm, [ --with-libxpm use libxpm (XPM file format)], wxUSE_LIBXPM)
|
WX_ARG_SYS_WITH(libxpm, [ --with-libxpm use libxpm (XPM file format)], wxUSE_LIBXPM)
|
||||||
WX_ARG_WITH(libmspack, [ --with-libmspack use libmspack (CHM help files loading)], wxUSE_LIBMSPACK)
|
WX_ARG_WITH(libmspack, [ --with-libmspack use libmspack (CHM help files loading)], wxUSE_LIBMSPACK)
|
||||||
WX_ARG_WITH(sdl, [ --with-sdl use SDL for audio on Unix], wxUSE_LIBSDL)
|
WX_ARG_WITH(sdl, [ --with-sdl use SDL for audio on Unix], wxUSE_LIBSDL)
|
||||||
WX_ARG_WITH(gnomeprint, [ --with-gnomeprint use GNOME print for printing under Unix], wxUSE_LIBGNOMEPRINT)
|
WX_ARG_WITH(gnomeprint, [ --with-gnomeprint use GNOME print for printing under GNOME], wxUSE_LIBGNOMEPRINT)
|
||||||
|
WX_ARG_WITH(gnomevfs, [ --with-gnomevfs use GNOME VFS for associating MIME types], wxUSE_LIBGNOMEVFS)
|
||||||
WX_ARG_WITH(hildon, [ --with-hildon use Hildon framework for Nokia 770], wxUSE_LIBHILDON)
|
WX_ARG_WITH(hildon, [ --with-hildon use Hildon framework for Nokia 770], wxUSE_LIBHILDON)
|
||||||
WX_ARG_WITH(opengl, [ --with-opengl use OpenGL (or Mesa)], wxUSE_OPENGL)
|
WX_ARG_WITH(opengl, [ --with-opengl use OpenGL (or Mesa)], wxUSE_OPENGL)
|
||||||
|
|
||||||
@@ -5400,6 +5403,26 @@ dnl EXTRALIBS_GNOMEPRINT="$LIBGNOMEPRINTUI_LIBS"
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "$WXGTK20" = 1; then
|
||||||
|
if test "$wxUSE_MIMETYPE" = "yes" ; then
|
||||||
|
if test "$wxUSE_LIBGNOMEVFS" = "yes" ; then
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(GNOMEVFS,
|
||||||
|
[gnome-vfs-2.0 >= 2.0],
|
||||||
|
[
|
||||||
|
dnl EXTRALIBS_GNOMEVFS="$LIBGNOMEVFS_LIBS"
|
||||||
|
CXXFLAGS="$GNOMEVFS_CFLAGS $CXXFLAGS"
|
||||||
|
AC_DEFINE(wxUSE_LIBGNOMEVFS)
|
||||||
|
],
|
||||||
|
[
|
||||||
|
AC_MSG_WARN([libgnomevfs not found, library won't be able to associate MIME type])
|
||||||
|
wxUSE_LIBGNOMEVFS="no"
|
||||||
|
]
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if test "$WXGTK20" = 1; then
|
if test "$WXGTK20" = 1; then
|
||||||
if test "$wxUSE_LIBHILDON" = "yes" ; then
|
if test "$wxUSE_LIBHILDON" = "yes" ; then
|
||||||
PKG_CHECK_MODULES(HILDON,
|
PKG_CHECK_MODULES(HILDON,
|
||||||
@@ -7083,7 +7106,7 @@ EXTRALIBS_XML="$EXPAT_LINK"
|
|||||||
EXTRALIBS_HTML="$MSPACK_LINK"
|
EXTRALIBS_HTML="$MSPACK_LINK"
|
||||||
EXTRALIBS_ODBC="$ODBC_LINK"
|
EXTRALIBS_ODBC="$ODBC_LINK"
|
||||||
if test "$wxUSE_GUI" = "yes"; then
|
if test "$wxUSE_GUI" = "yes"; then
|
||||||
EXTRALIBS_GUI=`echo $GUI_TK_LIBRARY $PNG_LINK $JPEG_LINK $TIFF_LINK $WEBKIT_LINK $EXTRALIBS_HILDON $EXTRALIBS_GNOMEPRINT`
|
EXTRALIBS_GUI=`echo $GUI_TK_LIBRARY $PNG_LINK $JPEG_LINK $TIFF_LINK $WEBKIT_LINK $EXTRALIBS_HILDON $EXTRALIBS_GNOMEVFS $EXTRALIBS_GNOMEPRINT`
|
||||||
fi
|
fi
|
||||||
if test "$wxUSE_OPENGL" = "yes"; then
|
if test "$wxUSE_OPENGL" = "yes"; then
|
||||||
EXTRALIBS_OPENGL="$LDFLAGS_GL $OPENGL_LIBS"
|
EXTRALIBS_OPENGL="$LDFLAGS_GL $OPENGL_LIBS"
|
||||||
@@ -7183,6 +7206,7 @@ AC_SUBST(EXTRALIBS_OPENGL)
|
|||||||
AC_SUBST(EXTRALIBS_SDL)
|
AC_SUBST(EXTRALIBS_SDL)
|
||||||
AC_SUBST(WITH_PLUGIN_SDL)
|
AC_SUBST(WITH_PLUGIN_SDL)
|
||||||
AC_SUBST(EXTRALIBS_GNOMEPRINT)
|
AC_SUBST(EXTRALIBS_GNOMEPRINT)
|
||||||
|
AC_SUBST(EXTRALIBS_GNOMEVFS)
|
||||||
AC_SUBST(EXTRALIBS_HILDON)
|
AC_SUBST(EXTRALIBS_HILDON)
|
||||||
AC_SUBST(UNICODE)
|
AC_SUBST(UNICODE)
|
||||||
AC_SUBST(BUILD)
|
AC_SUBST(BUILD)
|
||||||
@@ -7528,6 +7552,7 @@ echo " expat ${wxUSE_EXPAT}"
|
|||||||
echo " libmspack ${wxUSE_LIBMSPACK}"
|
echo " libmspack ${wxUSE_LIBMSPACK}"
|
||||||
echo " sdl ${wxUSE_LIBSDL}"
|
echo " sdl ${wxUSE_LIBSDL}"
|
||||||
echo " gnomeprint ${wxUSE_LIBGNOMEPRINT-none}"
|
echo " gnomeprint ${wxUSE_LIBGNOMEPRINT-none}"
|
||||||
|
echo " gnomevfs ${wxUSE_LIBGNOMEVFS-none}"
|
||||||
echo " hildon ${wxUSE_LIBHILDON-none}"
|
echo " hildon ${wxUSE_LIBHILDON-none}"
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
|
@@ -24,6 +24,7 @@
|
|||||||
// the things we really need
|
// the things we really need
|
||||||
#include "wx/string.h"
|
#include "wx/string.h"
|
||||||
#include "wx/dynarray.h"
|
#include "wx/dynarray.h"
|
||||||
|
#include "wx/arrstr.h"
|
||||||
|
|
||||||
// fwd decls
|
// fwd decls
|
||||||
class WXDLLIMPEXP_BASE wxIconLocation;
|
class WXDLLIMPEXP_BASE wxIconLocation;
|
||||||
@@ -66,6 +67,80 @@ public:
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// wxMimeTypeCommands stores the verbs defined for the given MIME type with
|
||||||
|
// their values
|
||||||
|
class WXDLLIMPEXP_BASE wxMimeTypeCommands
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxMimeTypeCommands() {}
|
||||||
|
|
||||||
|
wxMimeTypeCommands(const wxArrayString& verbs,
|
||||||
|
const wxArrayString& commands)
|
||||||
|
: m_verbs(verbs),
|
||||||
|
m_commands(commands)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// add a new verb with the command or replace the old value
|
||||||
|
void AddOrReplaceVerb(const wxString& verb, const wxString& cmd)
|
||||||
|
{
|
||||||
|
int n = m_verbs.Index(verb, false /* ignore case */);
|
||||||
|
if ( n == wxNOT_FOUND )
|
||||||
|
{
|
||||||
|
m_verbs.Add(verb);
|
||||||
|
m_commands.Add(cmd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_commands[n] = cmd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Add(const wxString& s)
|
||||||
|
{
|
||||||
|
m_verbs.Add(s.BeforeFirst(wxT('=')));
|
||||||
|
m_commands.Add(s.AfterFirst(wxT('=')));
|
||||||
|
}
|
||||||
|
|
||||||
|
// access the commands
|
||||||
|
size_t GetCount() const { return m_verbs.GetCount(); }
|
||||||
|
const wxString& GetVerb(size_t n) const { return m_verbs[n]; }
|
||||||
|
const wxString& GetCmd(size_t n) const { return m_commands[n]; }
|
||||||
|
|
||||||
|
bool HasVerb(const wxString& verb) const
|
||||||
|
{ return m_verbs.Index(verb) != wxNOT_FOUND; }
|
||||||
|
|
||||||
|
wxString GetCommandForVerb(const wxString& verb, size_t *idx = NULL) const
|
||||||
|
{
|
||||||
|
wxString s;
|
||||||
|
|
||||||
|
int n = m_verbs.Index(verb);
|
||||||
|
if ( n != wxNOT_FOUND )
|
||||||
|
{
|
||||||
|
s = m_commands[(size_t)n];
|
||||||
|
if ( idx )
|
||||||
|
*idx = n;
|
||||||
|
}
|
||||||
|
else if ( idx )
|
||||||
|
{
|
||||||
|
// different from any valid index
|
||||||
|
*idx = (size_t)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get a "verb=command" string
|
||||||
|
wxString GetVerbCmd(size_t n) const
|
||||||
|
{
|
||||||
|
return m_verbs[n] + wxT('=') + m_commands[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
wxArrayString m_verbs;
|
||||||
|
wxArrayString m_commands;
|
||||||
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxFileTypeInfo: static container of information accessed via wxFileType.
|
// wxFileTypeInfo: static container of information accessed via wxFileType.
|
||||||
//
|
//
|
||||||
@@ -269,6 +344,25 @@ private:
|
|||||||
wxFileTypeImpl *m_impl;
|
wxFileTypeImpl *m_impl;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
// wxMimeTypesManagerFactory
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class WXDLLIMPEXP_BASE wxMimeTypesManagerFactory
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxMimeTypesManagerFactory() {}
|
||||||
|
virtual ~wxMimeTypesManagerFactory() {}
|
||||||
|
|
||||||
|
virtual wxMimeTypesManagerImpl *CreateMimeTypesManagerImpl();
|
||||||
|
|
||||||
|
static void SetFactory( wxMimeTypesManagerFactory *factory );
|
||||||
|
static wxMimeTypesManagerFactory *GetFactory();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static wxMimeTypesManagerFactory *m_factory;
|
||||||
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxMimeTypesManager: interface to system MIME database.
|
// wxMimeTypesManager: interface to system MIME database.
|
||||||
//
|
//
|
||||||
|
@@ -26,7 +26,7 @@ class WXDLLEXPORT wxMimeTypesManagerImpl
|
|||||||
public:
|
public:
|
||||||
// ctor and dtor
|
// ctor and dtor
|
||||||
wxMimeTypesManagerImpl();
|
wxMimeTypesManagerImpl();
|
||||||
~wxMimeTypesManagerImpl();
|
virtual ~wxMimeTypesManagerImpl();
|
||||||
|
|
||||||
// load all data into memory - done when it is needed for the first time
|
// load all data into memory - done when it is needed for the first time
|
||||||
void Initialize(int mailcapStyles = wxMAILCAP_ALL,
|
void Initialize(int mailcapStyles = wxMAILCAP_ALL,
|
||||||
@@ -66,7 +66,7 @@ public:
|
|||||||
// file type
|
// file type
|
||||||
wxString GetExtension(size_t index) { return m_aExtensions[index]; }
|
wxString GetExtension(size_t index) { return m_aExtensions[index]; }
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
void InitIfNeeded();
|
void InitIfNeeded();
|
||||||
|
|
||||||
wxArrayString m_aTypes, // MIME types
|
wxArrayString m_aTypes, // MIME types
|
||||||
@@ -94,11 +94,6 @@ private:
|
|||||||
const wxArrayString& dirs);
|
const wxArrayString& dirs);
|
||||||
void GetGnomeMimeInfo(const wxString& sExtraDir);
|
void GetGnomeMimeInfo(const wxString& sExtraDir);
|
||||||
|
|
||||||
// write gnome files
|
|
||||||
bool CheckGnomeDirsExist();
|
|
||||||
bool WriteGnomeKeyFile(int index, bool delete_index);
|
|
||||||
bool WriteGnomeMimeFile(int index, bool delete_index);
|
|
||||||
|
|
||||||
// read KDE
|
// read KDE
|
||||||
void LoadKDELinksForMimeSubtype(const wxString& dirbase,
|
void LoadKDELinksForMimeSubtype(const wxString& dirbase,
|
||||||
const wxString& subdir,
|
const wxString& subdir,
|
||||||
@@ -127,20 +122,20 @@ private:
|
|||||||
|
|
||||||
// functions used to do associations
|
// functions used to do associations
|
||||||
|
|
||||||
int AddToMimeData(const wxString& strType,
|
virtual int AddToMimeData(const wxString& strType,
|
||||||
const wxString& strIcon,
|
const wxString& strIcon,
|
||||||
wxMimeTypeCommands *entry,
|
wxMimeTypeCommands *entry,
|
||||||
const wxArrayString& strExtensions,
|
const wxArrayString& strExtensions,
|
||||||
const wxString& strDesc,
|
const wxString& strDesc,
|
||||||
bool replaceExisting = TRUE);
|
bool replaceExisting = TRUE);
|
||||||
|
|
||||||
bool DoAssociation(const wxString& strType,
|
virtual bool DoAssociation(const wxString& strType,
|
||||||
const wxString& strIcon,
|
const wxString& strIcon,
|
||||||
wxMimeTypeCommands *entry,
|
wxMimeTypeCommands *entry,
|
||||||
const wxArrayString& strExtensions,
|
const wxArrayString& strExtensions,
|
||||||
const wxString& strDesc);
|
const wxString& strDesc);
|
||||||
|
|
||||||
bool WriteMimeInfo(int nIndex, bool delete_mime );
|
virtual bool WriteMimeInfo(int nIndex, bool delete_mime );
|
||||||
|
|
||||||
// give it access to m_aXXX variables
|
// give it access to m_aXXX variables
|
||||||
friend class WXDLLEXPORT wxFileTypeImpl;
|
friend class WXDLLEXPORT wxFileTypeImpl;
|
||||||
|
@@ -602,6 +602,10 @@
|
|||||||
* Use GNOME print for printing under GTK+ 2.0
|
* Use GNOME print for printing under GTK+ 2.0
|
||||||
*/
|
*/
|
||||||
#define wxUSE_LIBGNOMEPRINT 0
|
#define wxUSE_LIBGNOMEPRINT 0
|
||||||
|
/*
|
||||||
|
* Use GNOME VFS for MIME types
|
||||||
|
*/
|
||||||
|
#define wxUSE_LIBGNOMEVFS 0
|
||||||
/*
|
/*
|
||||||
* Use the Hildon framework
|
* Use the Hildon framework
|
||||||
*/
|
*/
|
||||||
|
@@ -453,6 +453,34 @@ bool wxFileType::SetDefaultIcon(const wxString& cmd, int index)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
// wxMimeTypesManagerFactory
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxMimeTypesManagerFactory *wxMimeTypesManagerFactory::m_factory = NULL;
|
||||||
|
|
||||||
|
/* static */
|
||||||
|
void wxMimeTypesManagerFactory::SetFactory( wxMimeTypesManagerFactory *factory )
|
||||||
|
{
|
||||||
|
if (wxMimeTypesManagerFactory::m_factory)
|
||||||
|
delete wxMimeTypesManagerFactory::m_factory;
|
||||||
|
|
||||||
|
wxMimeTypesManagerFactory::m_factory = factory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* static */
|
||||||
|
wxMimeTypesManagerFactory *wxMimeTypesManagerFactory::GetFactory()
|
||||||
|
{
|
||||||
|
if (!wxMimeTypesManagerFactory::m_factory)
|
||||||
|
wxMimeTypesManagerFactory::m_factory = new wxMimeTypesManagerFactory;
|
||||||
|
|
||||||
|
return wxMimeTypesManagerFactory::m_factory;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMimeTypesManagerImpl *wxMimeTypesManagerFactory::CreateMimeTypesManagerImpl()
|
||||||
|
{
|
||||||
|
return new wxMimeTypesManagerImpl;
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxMimeTypesManager
|
// wxMimeTypesManager
|
||||||
@@ -461,7 +489,7 @@ bool wxFileType::SetDefaultIcon(const wxString& cmd, int index)
|
|||||||
void wxMimeTypesManager::EnsureImpl()
|
void wxMimeTypesManager::EnsureImpl()
|
||||||
{
|
{
|
||||||
if ( !m_impl )
|
if ( !m_impl )
|
||||||
m_impl = new wxMimeTypesManagerImpl;
|
m_impl = wxMimeTypesManagerFactory::GetFactory()->CreateMimeTypesManagerImpl();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxMimeTypesManager::IsOfType(const wxString& mimeType,
|
bool wxMimeTypesManager::IsOfType(const wxString& mimeType,
|
||||||
|
@@ -78,6 +78,15 @@
|
|||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// link GnomeVFS
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#if wxUSE_LIBGNOMEVFS
|
||||||
|
#include "wx/html/forcelnk.h"
|
||||||
|
FORCE_LINK(gnome_vfs)
|
||||||
|
#endif
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// global data
|
// global data
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@@ -62,6 +62,9 @@
|
|||||||
|
|
||||||
#include "wx/unix/mimetype.h"
|
#include "wx/unix/mimetype.h"
|
||||||
|
|
||||||
|
// Not GUI dependent
|
||||||
|
#include "wx/gtk/gnome/gvfs.h"
|
||||||
|
|
||||||
// other standard headers
|
// other standard headers
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
@@ -70,80 +73,6 @@
|
|||||||
# pragma message disable unscomzer
|
# pragma message disable unscomzer
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// wxMimeTypeCommands stores the verbs defined for the given MIME type with
|
|
||||||
// their values
|
|
||||||
class wxMimeTypeCommands
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
wxMimeTypeCommands() {}
|
|
||||||
|
|
||||||
wxMimeTypeCommands(const wxArrayString& verbs,
|
|
||||||
const wxArrayString& commands)
|
|
||||||
: m_verbs(verbs),
|
|
||||||
m_commands(commands)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// add a new verb with the command or replace the old value
|
|
||||||
void AddOrReplaceVerb(const wxString& verb, const wxString& cmd)
|
|
||||||
{
|
|
||||||
int n = m_verbs.Index(verb, false /* ignore case */);
|
|
||||||
if ( n == wxNOT_FOUND )
|
|
||||||
{
|
|
||||||
m_verbs.Add(verb);
|
|
||||||
m_commands.Add(cmd);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_commands[n] = cmd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Add(const wxString& s)
|
|
||||||
{
|
|
||||||
m_verbs.Add(s.BeforeFirst(wxT('=')));
|
|
||||||
m_commands.Add(s.AfterFirst(wxT('=')));
|
|
||||||
}
|
|
||||||
|
|
||||||
// access the commands
|
|
||||||
size_t GetCount() const { return m_verbs.GetCount(); }
|
|
||||||
const wxString& GetVerb(size_t n) const { return m_verbs[n]; }
|
|
||||||
const wxString& GetCmd(size_t n) const { return m_commands[n]; }
|
|
||||||
|
|
||||||
bool HasVerb(const wxString& verb) const
|
|
||||||
{ return m_verbs.Index(verb) != wxNOT_FOUND; }
|
|
||||||
|
|
||||||
wxString GetCommandForVerb(const wxString& verb, size_t *idx = NULL) const
|
|
||||||
{
|
|
||||||
wxString s;
|
|
||||||
|
|
||||||
int n = m_verbs.Index(verb);
|
|
||||||
if ( n != wxNOT_FOUND )
|
|
||||||
{
|
|
||||||
s = m_commands[(size_t)n];
|
|
||||||
if ( idx )
|
|
||||||
*idx = n;
|
|
||||||
}
|
|
||||||
else if ( idx )
|
|
||||||
{
|
|
||||||
// different from any valid index
|
|
||||||
*idx = (size_t)-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get a "verb=command" string
|
|
||||||
wxString GetVerbCmd(size_t n) const
|
|
||||||
{
|
|
||||||
return m_verbs[n] + wxT('=') + m_commands[n];
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
wxArrayString m_verbs;
|
|
||||||
wxArrayString m_commands;
|
|
||||||
};
|
|
||||||
|
|
||||||
// this class extends wxTextFile
|
// this class extends wxTextFile
|
||||||
//
|
//
|
||||||
// VZ: ???
|
// VZ: ???
|
||||||
@@ -349,200 +278,10 @@ static bool IsKnownUnimportantField(const wxString& field);
|
|||||||
// 1. xxx.keys files under /usr/share/mime-info
|
// 1. xxx.keys files under /usr/share/mime-info
|
||||||
// 2. xxx.keys files under ~/.gnome/mime-info
|
// 2. xxx.keys files under ~/.gnome/mime-info
|
||||||
//
|
//
|
||||||
// The format of xxx.keys file is the following:
|
|
||||||
//
|
|
||||||
// mimetype/subtype:
|
|
||||||
// field=value
|
|
||||||
//
|
|
||||||
// with blank lines separating the entries and indented lines starting with
|
|
||||||
// TABs. We're interested in the field icon-filename whose value is the path
|
|
||||||
// containing the icon.
|
|
||||||
//
|
|
||||||
// Update (Chris Elliott): apparently there may be an optional "[lang]" prefix
|
// Update (Chris Elliott): apparently there may be an optional "[lang]" prefix
|
||||||
// just before the field name.
|
// just before the field name.
|
||||||
|
|
||||||
|
|
||||||
bool wxMimeTypesManagerImpl::CheckGnomeDirsExist()
|
|
||||||
{
|
|
||||||
wxString gnomedir;
|
|
||||||
wxGetHomeDir( &gnomedir );
|
|
||||||
wxString sTmp = gnomedir;
|
|
||||||
sTmp = sTmp + wxT("/.gnome");
|
|
||||||
if (! wxDir::Exists( sTmp ) )
|
|
||||||
{
|
|
||||||
if (!wxMkdir( sTmp ))
|
|
||||||
{
|
|
||||||
wxLogError(wxT("Failed to create directory %s/.gnome."), sTmp.c_str());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sTmp = sTmp + wxT("/mime-info");
|
|
||||||
if (! wxDir::Exists( sTmp ) )
|
|
||||||
{
|
|
||||||
if (!wxMkdir( sTmp ))
|
|
||||||
{
|
|
||||||
wxLogError(wxT("Failed to create directory %s/mime-info."), sTmp.c_str());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wxMimeTypesManagerImpl::WriteGnomeKeyFile(int index, bool delete_index)
|
|
||||||
{
|
|
||||||
wxString gnomedir;
|
|
||||||
wxGetHomeDir( &gnomedir );
|
|
||||||
|
|
||||||
wxMimeTextFile outfile( gnomedir + wxT("/.gnome/mime-info/user.keys"));
|
|
||||||
// if this fails probably Gnome is not installed ??
|
|
||||||
// create it anyway as a private mime store
|
|
||||||
|
|
||||||
#if defined(__WXGTK20__) && wxUSE_UNICODE
|
|
||||||
if (! outfile.Open( wxConvUTF8) )
|
|
||||||
#else
|
|
||||||
if (! outfile.Open() )
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
if (delete_index)
|
|
||||||
return false;
|
|
||||||
if (!CheckGnomeDirsExist() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
outfile.Create();
|
|
||||||
}
|
|
||||||
|
|
||||||
wxString sTmp, strType = m_aTypes[index];
|
|
||||||
int nIndex = outfile.pIndexOf(strType);
|
|
||||||
if ( nIndex == wxNOT_FOUND )
|
|
||||||
{
|
|
||||||
outfile.AddLine( strType + wxT(':') );
|
|
||||||
// see file:/usr/doc/gnome-libs-devel-1.0.40/devel-docs/mime-type-handling.txt
|
|
||||||
// as this does not deal with internationalisation
|
|
||||||
// wxT( "\t[en_US]") + verb + wxT ('=') + cmd + wxT(" %f");
|
|
||||||
wxMimeTypeCommands * entries = m_aEntries[index];
|
|
||||||
size_t count = entries->GetCount();
|
|
||||||
for ( size_t i = 0; i < count; i++ )
|
|
||||||
{
|
|
||||||
sTmp = entries->GetVerbCmd( i );
|
|
||||||
sTmp.Replace( wxT("%s"), wxT("%f") );
|
|
||||||
sTmp = wxT( "\t") + sTmp;
|
|
||||||
outfile.AddLine( sTmp );
|
|
||||||
}
|
|
||||||
|
|
||||||
//for international use do something like this
|
|
||||||
//outfile.AddLine( wxString( "\t[en_US]icon-filename=") + cmd );
|
|
||||||
outfile.AddLine( wxT( "\ticon-filename=") + m_aIcons[index] );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (delete_index)
|
|
||||||
outfile.CommentLine(nIndex);
|
|
||||||
|
|
||||||
wxMimeTypeCommands sOld;
|
|
||||||
size_t nOld = nIndex + 1;
|
|
||||||
bool oldEntryEnd = false;
|
|
||||||
while ( (nOld < outfile.GetLineCount() ) && !oldEntryEnd)
|
|
||||||
{
|
|
||||||
sTmp = outfile.GetLine(nOld);
|
|
||||||
if ( (sTmp[0u] == wxT('\t')) || (sTmp[0u] == wxT('#')) )
|
|
||||||
{
|
|
||||||
// we have another line to deal with
|
|
||||||
outfile.CommentLine(nOld);
|
|
||||||
nOld++;
|
|
||||||
|
|
||||||
// add the line to our store
|
|
||||||
if ((!delete_index) && (sTmp[0u] == wxT('\t')))
|
|
||||||
sOld.Add(sTmp);
|
|
||||||
}
|
|
||||||
// next mimetpye ?? or blank line
|
|
||||||
else
|
|
||||||
oldEntryEnd = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// list of entries in our data; these should all be in sOld,
|
|
||||||
// though sOld may also contain other entries , eg flags
|
|
||||||
if (!delete_index)
|
|
||||||
{
|
|
||||||
wxMimeTypeCommands * entries = m_aEntries[index];
|
|
||||||
size_t i;
|
|
||||||
for (i=0; i < entries->GetCount(); i++)
|
|
||||||
{
|
|
||||||
// replace any entries in sold that match verbs we know
|
|
||||||
sOld.AddOrReplaceVerb( entries->GetVerb(i), entries->GetCmd(i) );
|
|
||||||
}
|
|
||||||
|
|
||||||
//sOld should also contain the icon
|
|
||||||
if ( !m_aIcons[index].empty() )
|
|
||||||
sOld.AddOrReplaceVerb( wxT("icon-filename"), m_aIcons[index] );
|
|
||||||
|
|
||||||
for (i=0; i < sOld.GetCount(); i++)
|
|
||||||
{
|
|
||||||
sTmp = sOld.GetVerbCmd( i );
|
|
||||||
sTmp.Replace( wxT("%s"), wxT("%f") );
|
|
||||||
sTmp = wxT("\t") + sTmp;
|
|
||||||
nIndex++;
|
|
||||||
outfile.InsertLine( sTmp, nIndex );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool bTmp = outfile.Write();
|
|
||||||
return bTmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wxMimeTypesManagerImpl::WriteGnomeMimeFile(int index, bool delete_index)
|
|
||||||
{
|
|
||||||
wxString gnomedir;
|
|
||||||
wxGetHomeDir( &gnomedir );
|
|
||||||
|
|
||||||
wxMimeTextFile outfile( gnomedir + wxT("/.gnome/mime-info/user.mime") );
|
|
||||||
// if this fails probably Gnome is not installed ??
|
|
||||||
// create it anyway as a private mime store
|
|
||||||
if (! outfile.Open() )
|
|
||||||
{
|
|
||||||
if (delete_index)
|
|
||||||
return false;
|
|
||||||
if (!CheckGnomeDirsExist() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
outfile.Create();
|
|
||||||
}
|
|
||||||
|
|
||||||
wxString strType = m_aTypes[index];
|
|
||||||
int nIndex = outfile.pIndexOf(strType);
|
|
||||||
if ( nIndex == wxNOT_FOUND )
|
|
||||||
{
|
|
||||||
outfile.AddLine( strType );
|
|
||||||
outfile.AddLine( wxT("\text:") + m_aExtensions.Item(index) );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (delete_index)
|
|
||||||
{
|
|
||||||
outfile.CommentLine(nIndex);
|
|
||||||
outfile.CommentLine(nIndex + 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// check for next line being the right one to replace ??
|
|
||||||
wxString sOld = outfile.GetLine(nIndex + 1);
|
|
||||||
if (sOld.Contains( wxT("\text: ") ))
|
|
||||||
{
|
|
||||||
outfile.GetLine(nIndex + 1) = wxT("\text: ") + m_aExtensions.Item(index);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
outfile.InsertLine( wxT("\text: ") + m_aExtensions.Item(index), nIndex + 1 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool bTmp = outfile.Write();
|
|
||||||
return bTmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
|
void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
|
||||||
const wxArrayString& dirs)
|
const wxArrayString& dirs)
|
||||||
{
|
{
|
||||||
@@ -557,11 +296,12 @@ void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
|
|||||||
wxLogTrace(TRACE_MIME, wxT("--- Opened Gnome file %s ---"),
|
wxLogTrace(TRACE_MIME, wxT("--- Opened Gnome file %s ---"),
|
||||||
filename.c_str());
|
filename.c_str());
|
||||||
|
|
||||||
|
wxArrayString search_dirs( dirs );
|
||||||
|
|
||||||
// values for the entry being parsed
|
// values for the entry being parsed
|
||||||
wxString curMimeType, curIconFile;
|
wxString curMimeType, curIconFile;
|
||||||
wxMimeTypeCommands * entry = new wxMimeTypeCommands;
|
wxMimeTypeCommands * entry = new wxMimeTypeCommands;
|
||||||
|
|
||||||
// these are always empty in this file
|
|
||||||
wxArrayString strExtensions;
|
wxArrayString strExtensions;
|
||||||
wxString strDesc;
|
wxString strDesc;
|
||||||
|
|
||||||
@@ -576,53 +316,83 @@ void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
|
|||||||
|
|
||||||
wxLogTrace(TRACE_MIME, wxT("--- Reading from Gnome file %s '%s' ---"),
|
wxLogTrace(TRACE_MIME, wxT("--- Reading from Gnome file %s '%s' ---"),
|
||||||
filename.c_str(), pc);
|
filename.c_str(), pc);
|
||||||
|
|
||||||
|
// trim trailing space and tab
|
||||||
|
while ((*pc == wxT(' ')) || (*pc == wxT('\t')))
|
||||||
|
pc++;
|
||||||
|
|
||||||
wxString sTmp(pc);
|
wxString sTmp(pc);
|
||||||
if (sTmp.Contains(wxT("=")) )
|
int equal_pos = sTmp.Find( wxT('=') );
|
||||||
|
if (equal_pos > 0)
|
||||||
{
|
{
|
||||||
if (sTmp.Contains( wxT("icon-filename=") ) )
|
wxString left_of_equal = sTmp.Left( equal_pos );
|
||||||
{
|
const wxChar *right_of_equal = pc;
|
||||||
// GNOME 1:
|
right_of_equal += equal_pos+1;
|
||||||
curIconFile = sTmp.AfterFirst(wxT('='));
|
|
||||||
}
|
if (left_of_equal == wxT("icon_filename"))
|
||||||
else if (sTmp.Contains( wxT("icon_filename=") ) )
|
|
||||||
{
|
{
|
||||||
// GNOME 2:
|
// GNOME 2:
|
||||||
curIconFile = sTmp.AfterFirst(wxT('='));
|
curIconFile = right_of_equal;
|
||||||
|
|
||||||
if (!wxFileExists(curIconFile))
|
wxFileName newFile( curIconFile );
|
||||||
|
if (newFile.IsRelative() || newFile.FileExists())
|
||||||
{
|
{
|
||||||
size_t nDirs = dirs.GetCount();
|
size_t nDirs = search_dirs.GetCount();
|
||||||
|
|
||||||
for (size_t nDir = 0; nDir < nDirs; nDir++)
|
for (size_t nDir = 0; nDir < nDirs; nDir++)
|
||||||
{
|
{
|
||||||
wxFileName newFile( curIconFile );
|
newFile.SetPath( search_dirs[nDir] );
|
||||||
newFile.SetPath( dirs[nDir] );
|
|
||||||
newFile.AppendDir( wxT("pixmaps") );
|
newFile.AppendDir( wxT("pixmaps") );
|
||||||
newFile.AppendDir( wxT("document-icons") );
|
newFile.AppendDir( wxT("document-icons") );
|
||||||
newFile.SetExt( wxT("png") );
|
newFile.SetExt( wxT("png") );
|
||||||
if (newFile.FileExists())
|
if (newFile.FileExists())
|
||||||
|
{
|
||||||
curIconFile = newFile.GetFullPath();
|
curIconFile = newFile.GetFullPath();
|
||||||
|
// reorder search_dirs for speedup (fewer
|
||||||
|
// calls to FileExist() required)
|
||||||
|
if (nDir != 0)
|
||||||
|
{
|
||||||
|
wxString tmp = search_dirs[nDir];
|
||||||
|
search_dirs.RemoveAt( nDir );
|
||||||
|
search_dirs.Insert( tmp, 0 );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else //: some other field,
|
else if (left_of_equal == wxT("open"))
|
||||||
{
|
{
|
||||||
//may contain lines like this (RH7)
|
sTmp = right_of_equal;
|
||||||
// \t[lang]open.tex."TeX this file"=tex %f
|
sTmp.Replace( wxT("%f"), wxT("%s") );
|
||||||
// \tflags.tex.flags=needsterminal
|
sTmp.Prepend( wxT("open=") );
|
||||||
// \topen.latex."LaTeX this file"=latex %f
|
entry->Add(sTmp);
|
||||||
// \tflags.latex.flags=needsterminal
|
}
|
||||||
|
else if (left_of_equal == wxT("view"))
|
||||||
// \topen=xdvi %f
|
{
|
||||||
// \tview=xdvi %f
|
sTmp = right_of_equal;
|
||||||
// \topen.convert.Convert file to Postscript=dvips %f -o `basename %f .dvi`.ps
|
sTmp.Replace( wxT("%f"), wxT("%s") );
|
||||||
|
sTmp.Prepend( wxT("view=") );
|
||||||
// for now ignore lines with flags in...FIX
|
entry->Add(sTmp);
|
||||||
sTmp = sTmp.AfterLast(wxT(']'));
|
}
|
||||||
sTmp = sTmp.AfterLast(wxT('\t'));
|
else if (left_of_equal == wxT("print"))
|
||||||
sTmp.Trim(false).Trim();
|
{
|
||||||
if (0 == sTmp.Replace( wxT("%f"), wxT("%s") ))
|
sTmp = right_of_equal;
|
||||||
sTmp = sTmp + wxT(" %s");
|
sTmp.Replace( wxT("%f"), wxT("%s") );
|
||||||
|
sTmp.Prepend( wxT("print=") );
|
||||||
|
entry->Add(sTmp);
|
||||||
|
}
|
||||||
|
else if (left_of_equal == wxT("description"))
|
||||||
|
{
|
||||||
|
strDesc = right_of_equal;
|
||||||
|
}
|
||||||
|
else if (left_of_equal == wxT("short_list_application_ids_for_novice_user_level"))
|
||||||
|
{
|
||||||
|
sTmp = right_of_equal;
|
||||||
|
if (sTmp.Contains( wxT(",") ))
|
||||||
|
sTmp = sTmp.BeforeFirst( wxT(',') );
|
||||||
|
sTmp.Prepend( wxT("open=") );
|
||||||
|
sTmp.Append( wxT(" %s") );
|
||||||
entry->Add(sTmp);
|
entry->Add(sTmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1544,19 +1314,15 @@ void wxMimeTypesManagerImpl::InitIfNeeded()
|
|||||||
{
|
{
|
||||||
// set the flag first to prevent recursion
|
// set the flag first to prevent recursion
|
||||||
m_initialized = true;
|
m_initialized = true;
|
||||||
|
|
||||||
#if 1
|
|
||||||
Initialize();
|
|
||||||
#else
|
|
||||||
wxString wm = wxGetenv( wxT("WINDOWMANAGER") );
|
wxString wm = wxGetenv( wxT("WINDOWMANAGER") );
|
||||||
|
|
||||||
if (wm.Find( wxT("kde") ) != wxNOT_FOUND)
|
if (wm.Find( wxT("kde") ) != wxNOT_FOUND)
|
||||||
Initialize( wxMAILCAP_KDE | wxMAILCAP_STANDARD );
|
Initialize( wxMAILCAP_KDE );
|
||||||
else if (wm.Find( wxT("gnome") ) != wxNOT_FOUND)
|
else if (wm.Find( wxT("gnome") ) != wxNOT_FOUND)
|
||||||
Initialize( wxMAILCAP_GNOME | wxMAILCAP_STANDARD );
|
Initialize( wxMAILCAP_GNOME );
|
||||||
else
|
else
|
||||||
Initialize();
|
Initialize();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2003,7 +1769,7 @@ bool wxMimeTypesManagerImpl::DoAssociation(const wxString& strType,
|
|||||||
const wxString& strDesc)
|
const wxString& strDesc)
|
||||||
{
|
{
|
||||||
int nIndex = AddToMimeData(strType, strIcon, entry, strExtensions, strDesc, true);
|
int nIndex = AddToMimeData(strType, strIcon, entry, strExtensions, strDesc, true);
|
||||||
|
|
||||||
if ( nIndex == wxNOT_FOUND )
|
if ( nIndex == wxNOT_FOUND )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -2030,13 +1796,8 @@ bool wxMimeTypesManagerImpl::WriteMimeInfo(int nIndex, bool delete_mime )
|
|||||||
ok = false;
|
ok = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_mailcapStylesInited & wxMAILCAP_GNOME)
|
// Don't write GNOME files here as this is not
|
||||||
{
|
// allowed and simply doesn't work
|
||||||
// write in Gnome format;
|
|
||||||
if (WriteGnomeMimeFile(nIndex, delete_mime) )
|
|
||||||
if (WriteGnomeKeyFile(nIndex, delete_mime) )
|
|
||||||
ok = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_mailcapStylesInited & wxMAILCAP_KDE)
|
if (m_mailcapStylesInited & wxMAILCAP_KDE)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user