X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7dc3cc31af71522b8fc55b7f97bcba7f5ef9eac5..ef094fa075bc56bcbc33b12159c395ea28afda3b:/include/wx/unix/mimetype.h diff --git a/include/wx/unix/mimetype.h b/include/wx/unix/mimetype.h index 2677c1ffe7..a15f76f881 100644 --- a/include/wx/unix/mimetype.h +++ b/include/wx/unix/mimetype.h @@ -1,19 +1,18 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: unix/mimetype.h +// Name: wx/unix/mimetype.h // Purpose: classes and functions to manage MIME types // Author: Vadim Zeitlin // Modified by: // Created: 23.09.98 // RCS-ID: $Id$ // Copyright: (c) 1998 Vadim Zeitlin -// Licence: wxWindows license (part of wxExtra library) +// Licence: wxWindows licence (part of wxExtra library) ///////////////////////////////////////////////////////////////////////////// #ifndef _MIMETYPE_IMPL_H #define _MIMETYPE_IMPL_H - -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(__APPLE__) #pragma interface "mimetype.h" #endif @@ -21,21 +20,24 @@ #if (wxUSE_FILE && wxUSE_TEXTFILE) -class MailCapEntry; -class wxMimeTypeIconHandler; +class wxMimeTypeCommands; -WX_DEFINE_ARRAY(wxMimeTypeIconHandler *, ArrayIconHandlers); -WX_DEFINE_ARRAY(MailCapEntry *, ArrayTypeEntries); +WX_DEFINE_ARRAY(wxMimeTypeCommands *, wxMimeCommandsArray); // this is the real wxMimeTypesManager for Unix class WXDLLEXPORT wxMimeTypesManagerImpl { -friend class WXDLLEXPORT wxFileTypeImpl; // give it access to m_aXXX variables - public: - // ctor loads all info into memory for quicker access later on - // TODO it would be nice to load them all, but parse on demand only... + // ctor and dtor wxMimeTypesManagerImpl(); + ~wxMimeTypesManagerImpl(); + + // load all data into memory - done when it is needed for the first time + void Initialize(int mailcapStyles = wxMAILCAP_ALL, + const wxString& extraDir = wxEmptyString); + + // and delete the data here + void ClearData(); // implement containing class functions wxFileType *GetFileTypeFromExtension(const wxString& ext); @@ -58,65 +60,168 @@ public: const wxString& strTest, const wxString& strDesc); + // 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() + { + if ( !m_initialized ) { + // set the flag first to prevent recursion + m_initialized = TRUE; + Initialize(); + } + } + 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 - - // head of the linked list of the icon handlers - static ArrayIconHandlers ms_iconHandlers; + m_aExtensions, // space separated list of extensions + m_aIcons; // Icon filenames + + // verb=command pairs for this file type + wxMimeCommandsArray m_aEntries; + + // are we initialized? + bool m_initialized; + + // 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, + const wxArrayString& dirs); + void LoadGnomeMimeTypesFromMimeFile(const wxString& filename); + void LoadGnomeMimeFilesFromDir(const wxString& dirbase, + const wxArrayString& dirs); + 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); + + // ReadMailcap() helper + bool ProcessOtherMailcapField(struct MailcapLineData& data, + const wxString& curField); + + // functions used to do associations + + int AddToMimeData(const wxString& strType, + const wxString& strIcon, + wxMimeTypeCommands *entry, + const wxArrayString& strExtensions, + const wxString& strDesc, + bool replaceExisting = TRUE); + + bool DoAssociation(const wxString& strType, + const wxString& strIcon, + wxMimeTypeCommands *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; }; + + 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 = index; } + { m_manager = manager; m_index.Add(index); } // accessors bool GetExtensions(wxArrayString& extensions); bool GetMimeType(wxString *mimeType) const - { *mimeType = m_manager->m_aTypes[m_index]; return TRUE; } - bool GetIcon(wxIcon *icon) const; + { *mimeType = m_manager->m_aTypes[m_index[0]]; return TRUE; } + bool GetMimeTypes(wxArrayString& mimeTypes) const; + bool GetIcon(wxIcon *icon, wxString *iconFile = NULL, + int *iconIndex = NULL) const; + bool GetDescription(wxString *desc) const - { *desc = m_manager->m_aDescriptions[m_index]; return TRUE; } + { *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() ); } -private: - // get the entry which passes the test (may return NULL) - MailCapEntry *GetEntry(const wxFileType::MessageParameters& params) const; + // 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; - // choose the correct entry to use and expand the command - bool GetExpandedCommand(wxString *expandedCmd, - const wxFileType::MessageParameters& params, - bool open) const; - wxMimeTypesManagerImpl *m_manager; - size_t m_index; // in the wxMimeTypesManagerImpl arrays -}; + // remove the record for this file type + // 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: + wxString + GetExpandedCommand(const wxString & verb, + const wxFileType::MessageParameters& params) const; + wxMimeTypesManagerImpl *m_manager; + wxArrayInt m_index; // in the wxMimeTypesManagerImpl arrays +}; #endif // wxUSE_FILE