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