1 ///////////////////////////////////////////////////////////////////////////// 2 // Name: wx/unix/mimetype.h 3 // Purpose: classes and functions to manage MIME types 4 // Author: Vadim Zeitlin 5 // Modified by: 6 // Created: 23.09.98 7 // RCS-ID: $Id: mimetype.h 43723 2006-11-30 13:24:32Z RR $ 8 // Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> 9 // Licence: wxWindows licence (part of wxExtra library) 10 ///////////////////////////////////////////////////////////////////////////// 11 12 #ifndef _MIMETYPE_IMPL_H 13 #define _MIMETYPE_IMPL_H 14 15 #include "wx/mimetype.h" 16 17 #if wxUSE_MIMETYPE 18 19 class wxMimeTypeCommands; 20 21 WX_DEFINE_ARRAY_PTR(wxMimeTypeCommands *, wxMimeCommandsArray); 22 23 // this is the real wxMimeTypesManager for Unix 24 class WXDLLEXPORT wxMimeTypesManagerImpl 25 { 26 public: 27 // ctor and dtor 28 wxMimeTypesManagerImpl(); 29 virtual ~wxMimeTypesManagerImpl(); 30 31 // load all data into memory - done when it is needed for the first time 32 void Initialize(int mailcapStyles = wxMAILCAP_ALL, 33 const wxString& extraDir = wxEmptyString); 34 35 // and delete the data here 36 void ClearData(); 37 38 // implement containing class functions 39 wxFileType *GetFileTypeFromExtension(const wxString& ext); 40 wxFileType *GetFileTypeFromMimeType(const wxString& mimeType); 41 42 size_t EnumAllFileTypes(wxArrayString& mimetypes); 43 44 bool ReadMailcap(const wxString& filename, bool fallback = FALSE); 45 bool ReadMimeTypes(const wxString& filename); 46 47 void AddFallback(const wxFileTypeInfo& filetype); 48 49 // add information about the given mimetype 50 void AddMimeTypeInfo(const wxString& mimetype, 51 const wxString& extensions, 52 const wxString& description); 53 void AddMailcapInfo(const wxString& strType, 54 const wxString& strOpenCmd, 55 const wxString& strPrintCmd, 56 const wxString& strTest, 57 const wxString& strDesc); 58 59 // add a new record to the user .mailcap/.mime.types files 60 wxFileType *Associate(const wxFileTypeInfo& ftInfo); 61 // remove association 62 bool Unassociate(wxFileType *ft); 63 64 // accessors 65 // get the string containing space separated extensions for the given 66 // file type GetExtension(size_t index)67 wxString GetExtension(size_t index) { return m_aExtensions[index]; } 68 69 protected: 70 void InitIfNeeded(); 71 72 wxArrayString m_aTypes, // MIME types 73 m_aDescriptions, // descriptions (just some text) 74 m_aExtensions, // space separated list of extensions 75 m_aIcons; // Icon filenames 76 77 // verb=command pairs for this file type 78 wxMimeCommandsArray m_aEntries; 79 80 // are we initialized? 81 bool m_initialized; 82 83 // keep track of the files we had already loaded (this is a bitwise OR of 84 // wxMailcapStyle values) 85 int m_mailcapStylesInited; 86 87 wxString GetCommand(const wxString &verb, size_t nIndex) const; 88 89 // read Gnome files 90 void LoadGnomeDataFromKeyFile(const wxString& filename, 91 const wxArrayString& dirs); 92 void LoadGnomeMimeTypesFromMimeFile(const wxString& filename); 93 void LoadGnomeMimeFilesFromDir(const wxString& dirbase, 94 const wxArrayString& dirs); 95 void GetGnomeMimeInfo(const wxString& sExtraDir); 96 97 // read KDE 98 void LoadKDELinksForMimeSubtype(const wxString& dirbase, 99 const wxString& subdir, 100 const wxString& filename, 101 const wxArrayString& icondirs); 102 void LoadKDELinksForMimeType(const wxString& dirbase, 103 const wxString& subdir, 104 const wxArrayString& icondirs); 105 void LoadKDELinkFilesFromDir(const wxString& dirbase, 106 const wxArrayString& icondirs); 107 void LoadKDEApp(const wxString& filename); 108 void LoadKDEAppsFilesFromDir(const wxString& dirname); 109 void GetKDEMimeInfo(const wxString& sExtraDir); 110 111 // write KDE 112 bool WriteKDEMimeFile(int index, bool delete_index); 113 bool CheckKDEDirsExist(const wxString & sOK, const wxString& sTest); 114 115 //read write Netscape and MetaMail formats 116 void GetMimeInfo (const wxString& sExtraDir); 117 bool WriteToMailCap (int index, bool delete_index); 118 bool WriteToMimeTypes (int index, bool delete_index); 119 bool WriteToNSMimeTypes (int index, bool delete_index); 120 121 // ReadMailcap() helper 122 bool ProcessOtherMailcapField(struct MailcapLineData& data, 123 const wxString& curField); 124 125 // functions used to do associations 126 127 virtual int AddToMimeData(const wxString& strType, 128 const wxString& strIcon, 129 wxMimeTypeCommands *entry, 130 const wxArrayString& strExtensions, 131 const wxString& strDesc, 132 bool replaceExisting = TRUE); 133 134 virtual bool DoAssociation(const wxString& strType, 135 const wxString& strIcon, 136 wxMimeTypeCommands *entry, 137 const wxArrayString& strExtensions, 138 const wxString& strDesc); 139 140 virtual bool WriteMimeInfo(int nIndex, bool delete_mime ); 141 142 // give it access to m_aXXX variables 143 friend class WXDLLEXPORT wxFileTypeImpl; 144 }; 145 146 147 148 class WXDLLEXPORT wxFileTypeImpl 149 { 150 public: 151 // initialization functions 152 // this is used to construct a list of mimetypes which match; 153 // if built with GetFileTypeFromMimetype index 0 has the exact match and 154 // index 1 the type / * match 155 // if built with GetFileTypeFromExtension, index 0 has the mimetype for 156 // the first extension found, index 1 for the second and so on 157 Init(wxMimeTypesManagerImpl * manager,size_t index)158 void Init(wxMimeTypesManagerImpl *manager, size_t index) 159 { m_manager = manager; m_index.Add(index); } 160 161 // accessors 162 bool GetExtensions(wxArrayString& extensions); GetMimeType(wxString * mimeType)163 bool GetMimeType(wxString *mimeType) const 164 { *mimeType = m_manager->m_aTypes[m_index[0]]; return TRUE; } 165 bool GetMimeTypes(wxArrayString& mimeTypes) const; 166 bool GetIcon(wxIconLocation *iconLoc) const; 167 GetDescription(wxString * desc)168 bool GetDescription(wxString *desc) const 169 { *desc = m_manager->m_aDescriptions[m_index[0]]; return TRUE; } 170 GetOpenCommand(wxString * openCmd,const wxFileType::MessageParameters & params)171 bool GetOpenCommand(wxString *openCmd, 172 const wxFileType::MessageParameters& params) const 173 { 174 *openCmd = GetExpandedCommand(wxT("open"), params); 175 return (! openCmd -> IsEmpty() ); 176 } 177 GetPrintCommand(wxString * printCmd,const wxFileType::MessageParameters & params)178 bool GetPrintCommand(wxString *printCmd, 179 const wxFileType::MessageParameters& params) const 180 { 181 *printCmd = GetExpandedCommand(wxT("print"), params); 182 return (! printCmd -> IsEmpty() ); 183 } 184 185 // return the number of commands defined for this file type, 0 if none 186 size_t GetAllCommands(wxArrayString *verbs, wxArrayString *commands, 187 const wxFileType::MessageParameters& params) const; 188 189 190 // remove the record for this file type 191 // probably a mistake to come here, use wxMimeTypesManager.Unassociate (ft) instead Unassociate(wxFileType * ft)192 bool Unassociate(wxFileType *ft) 193 { 194 return m_manager->Unassociate(ft); 195 } 196 197 // set an arbitrary command, ask confirmation if it already exists and 198 // overwriteprompt is TRUE 199 bool SetCommand(const wxString& cmd, const wxString& verb, bool overwriteprompt = TRUE); 200 bool SetDefaultIcon(const wxString& strIcon = wxEmptyString, int index = 0); 201 202 private: 203 wxString 204 GetExpandedCommand(const wxString & verb, 205 const wxFileType::MessageParameters& params) const; 206 207 wxMimeTypesManagerImpl *m_manager; 208 wxArrayInt m_index; // in the wxMimeTypesManagerImpl arrays 209 }; 210 211 #endif // wxUSE_MIMETYPE 212 213 #endif // _MIMETYPE_IMPL_H 214 215 216