applied MIME patch(es) from Chris Elliott

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9865 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2001-04-23 23:46:21 +00:00
parent 4ea45e6ba3
commit 2b813b73cd
6 changed files with 1830 additions and 795 deletions

View File

@@ -32,6 +32,18 @@ class WXDLLEXPORT wxIcon;
class WXDLLEXPORT wxFileTypeImpl;
class WXDLLEXPORT wxMimeTypesManagerImpl;
// these constants define the MIME informations source under UNIX and are used
// by wxMimeTypesManager::Initialize()
enum wxMailcapStyle
{
wxMAILCAP_STANDARD = 1,
wxMAILCAP_NETSCAPE = 2,
wxMAILCAP_KDE = 4,
wxMAILCAP_GNOME = 8,
wxMAILCAP_ALL = 15
};
/*
TODO: would it be more convenient to have this class?
@@ -75,6 +87,10 @@ public:
// extensions
...);
// the array elements correspond to the parameters of the ctor above in
// the same order
wxFileTypeInfo(const wxArrayString& sArray);
// invalid item - use this to terminate the array passed to
// wxMimeTypesManager::AddFallbacks
wxFileTypeInfo() { }
@@ -105,6 +121,7 @@ public:
const wxString& GetDescription() const { return m_desc; }
// get the array of all extensions
const wxArrayString& GetExtensions() const { return m_exts; }
int GetExtensionsCount() const {return m_exts.GetCount(); }
// get the icon info
const wxString& GetIconFile() const { return m_iconFile; }
int GetIconIndex() const { return m_iconIndex; }
@@ -122,6 +139,7 @@ private:
wxArrayString m_exts; // the extensions which are mapped on this filetype
#if 0 // TODO
// the additional (except "open" and "print") command names and values
wxArrayString m_commandNames,
@@ -210,6 +228,14 @@ public:
size_t GetAllCommands(wxArrayString *verbs, wxArrayString *commands,
const wxFileType::MessageParameters& params) const;
// set an arbitrary command, ask confirmation if it already exists and
// overwriteprompt is TRUE
bool SetCommand(const wxString& cmd, const wxString& verb,
bool overwriteprompt = TRUE);
bool SetDefaultIcon(const wxString& cmd = wxEmptyString, int index = 0);
// remove the association for this filetype from the system MIME database:
// notice that it will only work if the association is defined in the user
// file/registry part, we will never modify the system-wide settings
@@ -265,6 +291,20 @@ public:
// ctor
wxMimeTypesManager();
// NB: the following 2 functions are for Unix only and don't do anything
// elsewhere
// loads data from standard files according to the mailcap styles
// specified: this is a bitwise OR of wxMailcapStyle values
//
// use the extraDir parameter if you want to look for files in another
// directory
void Initialize(int mailcapStyle = wxMAILCAP_STANDARD,
const wxString& extraDir = wxEmptyString);
// and this function clears all the data from the manager
void ClearData();
// Database lookup: all functions return a pointer to wxFileType object
// whose methods may be used to query it for the information you're
// interested in. If the return value is !NULL, caller is responsible for
@@ -276,6 +316,9 @@ public:
// other operations: return TRUE if there were no errors or FALSE if there
// were some unreckognized entries (the good entries are always read anyhow)
//
// FIXME: These ought to be private ??
// read in additional file (the standard ones are read automatically)
// in mailcap format (see mimetype.cpp for description)
//
@@ -283,6 +326,7 @@ public:
// settings from other, previously parsed, files by this one: normally,
// the files read most recently would override the older files, but with
// fallback == TRUE this won't happen
bool ReadMailcap(const wxString& filename, bool fallback = FALSE);
// read in additional file in mime.types format
bool ReadMimeTypes(const wxString& filename);
@@ -306,10 +350,11 @@ public:
// create a new association using the fields of wxFileTypeInfo (at least
// the MIME type and the extension should be set)
// if the other fields are empty, the existing values should be left alone
wxFileType *Associate(const wxFileTypeInfo& ftInfo);
// undo Associate()
bool Unassociate(wxFileType *ft) { return ft->Unassociate(); }
bool Unassociate(wxFileType *ft) ;
// dtor (not virtual, shouldn't be derived from)
~wxMimeTypesManager();
@@ -342,5 +387,3 @@ WXDLLEXPORT_DATA(extern wxMimeTypesManager *) wxTheMimeTypesManager;
#endif
//_WX_MIMETYPE_H_
/* vi: set cin tw=80 ts=4 sw=4: */

View File

@@ -54,18 +54,16 @@ public:
bool Unassociate();
// these methods are not publicly accessible (as wxMimeTypesManager
// doesn't know about them), and generally not very useful - they could be
// removed in the (near) future
bool SetCommand(const wxString& cmd, const wxString& verb,
bool overwriteprompt = true);
bool SetMimeType(const wxString& mimeType);
// set an arbitrary command, ask confirmation if it already exists and
// overwriteprompt is TRUE
bool SetCommand(const wxString& cmd,
const wxString& verb,
bool overwriteprompt = TRUE);
bool SetDefaultIcon(const wxString& cmd = wxEmptyString, int index = 0);
bool RemoveOpenCommand();
bool RemoveCommand(const wxString& verb);
bool RemoveMimeType();
bool RemoveDefaultIcon();
// this is called by Associate
bool SetDescription (const wxString& desc);
private:
// helper function: reads the command corresponding to the specified verb
@@ -81,6 +79,15 @@ private:
wxString m_strFileType, // may be empty
m_ext;
// these methods are not publicly accessible (as wxMimeTypesManager
// doesn't know about them), and should only be called by Unassociate
bool RemoveOpenCommand();
bool RemoveCommand(const wxString& verb);
bool RemoveMimeType();
bool RemoveDefaultIcon();
bool RemoveDescription();
};
class WXDLLEXPORT wxMimeTypesManagerImpl
@@ -92,12 +99,12 @@ public:
// implement containing class functions
wxFileType *GetFileTypeFromExtension(const wxString& ext);
wxFileType *GetOrAllocateFileTypeFromExtension(const wxString& ext) ;
wxFileType *GetOrAllocateFileTypeFromExtension(const wxString& ext);
wxFileType *GetFileTypeFromMimeType(const wxString& mimeType);
size_t EnumAllFileTypes(wxArrayString& mimetypes);
// this are NOPs under Windows
// these are NOPs under Windows
bool ReadMailcap(const wxString& filename, bool fallback = TRUE)
{ return TRUE; }
bool ReadMimeTypes(const wxString& filename)

View File

@@ -12,7 +12,6 @@
#ifndef _MIMETYPE_IMPL_H
#define _MIMETYPE_IMPL_H
#ifdef __GNUG__
#pragma interface "mimetype.h"
#endif
@@ -21,11 +20,9 @@
#if (wxUSE_FILE && wxUSE_TEXTFILE)
class MailCapEntry;
class wxMimeTypeIconHandler;
class wxMimeArrayString;
WX_DEFINE_ARRAY(wxMimeTypeIconHandler *, ArrayIconHandlers);
WX_DEFINE_ARRAY(MailCapEntry *, ArrayTypeEntries);
WX_DEFINE_ARRAY(wxMimeArrayString *, wxArrayTypeEntries);
// this is the real wxMimeTypesManager for Unix
class WXDLLEXPORT wxMimeTypesManagerImpl
@@ -36,7 +33,11 @@ public:
~wxMimeTypesManagerImpl();
// load all data into memory - done when it is needed for the first time
void Initialize();
void Initialize(int mailcapStyles,
const wxString& extraDir = wxEmptyString);
// and delete the data here
void ClearData();
// implement containing class functions
wxFileType *GetFileTypeFromExtension(const wxString& ext);
@@ -61,15 +62,14 @@ public:
// add a new record to the user .mailcap/.mime.types files
wxFileType *Associate(const wxFileTypeInfo& ftInfo);
// remove association
bool Unassociate(wxFileType *ft);
// accessors
// get the string containing space separated extensions for the given
// file type
wxString GetExtension(size_t index) { return m_aExtensions[index]; }
// get the array of icon handlers
static ArrayIconHandlers& GetIconHandlers();
private:
void InitIfNeeded()
{
@@ -82,14 +82,70 @@ private:
wxArrayString m_aTypes, // MIME types
m_aDescriptions, // descriptions (just some text)
m_aExtensions; // space separated list of extensions
ArrayTypeEntries m_aEntries; // commands and tests for this file type
m_aExtensions, // space separated list of extensions
m_aIcons; // Icon filenames
// verb=command pairs for this file type
wxArrayTypeEntries m_aEntries;
// are we initialized?
bool m_initialized;
// head of the linked list of the icon handlers
static ArrayIconHandlers ms_iconHandlers;
// keep track of the files we had already loaded (this is a bitwise OR of
// wxMailcapStyle values)
int m_mailcapStylesInited;
wxString GetCommand(const wxString &verb, size_t nIndex) const;
// read Gnome files
void LoadGnomeDataFromKeyFile(const wxString& filename);
void LoadGnomeMimeTypesFromMimeFile(const wxString& filename);
void LoadGnomeMimeFilesFromDir(const wxString& dirbase);
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
void LoadKDELinksForMimeSubtype(const wxString& dirbase,
const wxString& subdir,
const wxString& filename,
const wxArrayString& icondirs);
void LoadKDELinksForMimeType(const wxString& dirbase,
const wxString& subdir,
const wxArrayString& icondirs);
void LoadKDELinkFilesFromDir(const wxString& dirbase,
const wxArrayString& icondirs);
void GetKDEMimeInfo(const wxString& sExtraDir);
// write KDE
bool WriteKDEMimeFile(int index, bool delete_index);
bool CheckKDEDirsExist(const wxString & sOK, const wxString& sTest);
//read write Netscape and MetaMail formats
void GetMimeInfo (const wxString& sExtraDir);
bool WriteToMailCap (int index, bool delete_index);
bool WriteToMimeTypes (int index, bool delete_index);
bool WriteToNSMimeTypes (int index, bool delete_index);
// functions used to do associations
int AddToMimeData(const wxString& strType,
const wxString& strIcon,
wxMimeArrayString *entry,
const wxArrayString& strExtensions,
const wxString& strDesc,
bool replaceExisting = TRUE);
bool DoAssociation(const wxString& strType,
const wxString& strIcon,
wxMimeArrayString *entry,
const wxArrayString& strExtensions,
const wxString& strDesc);
bool WriteMimeInfo(int nIndex, bool delete_mime );
// give it access to m_aXXX variables
friend class WXDLLEXPORT wxFileTypeImpl;
@@ -101,6 +157,12 @@ class WXDLLEXPORT wxFileTypeImpl
{
public:
// initialization functions
// this is used to construct a list of mimetypes which match;
// if built with GetFileTypeFromMimetype index 0 has the exact match and
// index 1 the type / * match
// if built with GetFileTypeFromExtension, index 0 has the mimetype for
// the first extension found, index 1 for the second and so on
void Init(wxMimeTypesManagerImpl *manager, size_t index)
{ m_manager = manager; m_index.Add(index); }
@@ -109,33 +171,47 @@ public:
bool GetMimeType(wxString *mimeType) const
{ *mimeType = m_manager->m_aTypes[m_index[0]]; return TRUE; }
bool GetMimeTypes(wxArrayString& mimeTypes) const;
bool GetIcon(wxIcon *icon) const;
bool GetIcon(wxIcon *icon, wxString *iconFile = NULL,
int *iconIndex = NULL) const;
bool GetDescription(wxString *desc) const
{ *desc = m_manager->m_aDescriptions[m_index[0]]; return TRUE; }
bool GetOpenCommand(wxString *openCmd,
const wxFileType::MessageParameters& params) const
{
return GetExpandedCommand(openCmd, params, TRUE);
*openCmd = GetExpandedCommand(wxT("open"), params);
return (! openCmd -> IsEmpty() );
}
bool GetPrintCommand(wxString *printCmd,
const wxFileType::MessageParameters& params) const
{
return GetExpandedCommand(printCmd, params, FALSE);
*printCmd = GetExpandedCommand(wxT("print"), params);
return (! printCmd -> IsEmpty() );
}
// return the number of commands defined for this file type, 0 if none
size_t GetAllCommands(wxArrayString *verbs, wxArrayString *commands,
const wxFileType::MessageParameters& params) const;
// remove the record for this file type
bool Unassociate();
// probably a mistake to come here, use wxMimeTypesManager.Unassociate (ft) instead
bool Unassociate(wxFileType *ft)
{
return m_manager->Unassociate(ft);
}
// set an arbitrary command, ask confirmation if it already exists and
// overwriteprompt is TRUE
bool SetCommand(const wxString& cmd, const wxString& verb, bool overwriteprompt = TRUE);
bool SetDefaultIcon(const wxString& strIcon = wxEmptyString, int index = 0);
private:
// get the entry which passes the test (may return NULL)
MailCapEntry *GetEntry(const wxFileType::MessageParameters& params) const;
// choose the correct entry to use and expand the command
bool GetExpandedCommand(wxString *expandedCmd,
const wxFileType::MessageParameters& params,
bool open) const;
wxString
GetExpandedCommand(const wxString & verb,
const wxFileType::MessageParameters& params) const;
wxMimeTypesManagerImpl *m_manager;
wxArrayInt m_index; // in the wxMimeTypesManagerImpl arrays