]> git.saurik.com Git - wxWidgets.git/blob - include/wx/unix/mimetype.h
check that the version of __sync_sub_and_fetch that returns a value is supported...
[wxWidgets.git] / include / wx / unix / mimetype.h
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$
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
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 WXDLLIMPEXP_FWD_BASE 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
158 void Init(wxMimeTypesManagerImpl *manager, size_t index)
159 { m_manager = manager; m_index.Add(index); }
160
161 // accessors
162 bool GetExtensions(wxArrayString& extensions);
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
168 bool GetDescription(wxString *desc) const
169 { *desc = m_manager->m_aDescriptions[m_index[0]]; return TRUE; }
170
171 bool GetOpenCommand(wxString *openCmd,
172 const wxFileType::MessageParameters& params) const
173 {
174 *openCmd = GetExpandedCommand(wxT("open"), params);
175 return (! openCmd -> IsEmpty() );
176 }
177
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
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