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
19class wxMimeTypeCommands;
20
21WX_DEFINE_ARRAY_PTR(wxMimeTypeCommands *, wxMimeCommandsArray);
22
23// this is the real wxMimeTypesManager for Unix
24class WXDLLEXPORT wxMimeTypesManagerImpl
25{
26public:
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
69protected:
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
148class WXDLLEXPORT wxFileTypeImpl
149{
150public:
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
202private:
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