// other standard headers
#include <ctype.h>
-// this class extends wxTextFile
+// this class is a wxTextFile specialization for dealing with files storing
+// various MIME-related information
//
-// VZ: ???
+// it should be used instead of wxTextFile even if none of its additional
+// methods are used just because it handles files with mixed encodings (often
+// the case for MIME files which contain strings for different languages)
+// correctly, see OnRead()
class wxMimeTextFile : public wxTextFile
{
public:
// constructors
- wxMimeTextFile () : wxTextFile () {};
- wxMimeTextFile(const wxString& strFile) : wxTextFile(strFile) {};
+ wxMimeTextFile () : wxTextFile () { }
+ wxMimeTextFile(const wxString& strFile) : wxTextFile(strFile) { }
- int pIndexOf(const wxString & sSearch, bool bIncludeComments = false, int iStart = 0)
+ int pIndexOf(const wxString& sSearch,
+ bool bIncludeComments = false,
+ int iStart = 0)
{
wxString sTest = sSearch;
sTest.MakeLower();
wxString sTmp = GetLine(i).AfterFirst(wxT('='));
return sTmp;
}
+
+protected:
+ // we override this virtual method because we want to always use UTF-8
+ // conversion allowing for invalid characters as MIME information files
+ // often contain lines in different encodings and can't be read using any
+ // single conversion in Unicode build, so we just try to read what we can
+ // suing the most common encoding (UTF-8 is almost ubiquitous nowadays) and
+ // ignore the rest
+ virtual bool OnRead(const wxMBConv& WXUNUSED(conv))
+ {
+ return wxTextFile::OnRead(
+ wxMBConvUTF8(wxMBConvUTF8::MAP_INVALID_UTF8_TO_PUA));
+ }
};
// in case we're compiling in non-GUI mode
void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
const wxArrayString& dirs)
{
- wxTextFile textfile(filename);
-#if defined(__WXGTK20__) && wxUSE_UNICODE
- if ( !textfile.Open(wxMBConvUTF8(wxMBConvUTF8::MAP_INVALID_UTF8_TO_OCTAL)) )
-#else
+ wxMimeTextFile textfile(filename);
if ( !textfile.Open() )
-#endif
return;
wxLogTrace(TRACE_MIME, wxT("--- Opened Gnome file %s ---"),
void wxMimeTypesManagerImpl::LoadGnomeMimeTypesFromMimeFile(const wxString& filename)
{
- wxTextFile textfile(filename);
+ wxMimeTextFile textfile(filename);
if ( !textfile.Open() )
return;
const wxArrayString& icondirs)
{
wxFileName fullname(dirbase, filename);
- wxMimeTextFile file;
- {
- wxLogNull logNull;
- if ( !file.Open(fullname.GetFullPath()) )
- if ( !file.Open(fullname.GetFullPath(), wxConvISO8859_1) )
- return;
- }
-
wxLogTrace(TRACE_MIME, wxT("loading KDE file %s"),
fullname.GetFullPath().c_str());
+ wxMimeTextFile file;
+ if ( !file.Open(fullname.GetFullPath()) )
+ return;
+
wxMimeTypeCommands * entry = new wxMimeTypeCommands;
wxArrayString sExts;
wxString mimetype, mime_desc, strIcon;
// Read a KDE .desktop file of type 'Application'
void wxMimeTypesManagerImpl::LoadKDEApp(const wxString& filename)
{
- wxMimeTextFile file;
-
- {
- wxLogNull logNull;
- if ( !file.Open(filename) )
- if ( !file.Open(filename, wxConvISO8859_1) )
- return;
- }
-
wxLogTrace(TRACE_MIME, wxT("loading KDE file %s"), filename.c_str());
+ wxMimeTextFile file;
+ if ( !file.Open(filename) )
+ return;
+
// Here, only type 'Application' should be considered.
int nIndex = file.pIndexOf( wxT("Type=") );
if (nIndex != wxNOT_FOUND &&
static wxString GetKDEThemeInFile(const wxFileName& filename)
{
wxString theme;
- wxTextFile config;
- if(filename.FileExists() && config.Open( filename.GetFullPath() )) {
+ wxMimeTextFile config;
+ if ( filename.FileExists() && config.Open(filename.GetFullPath()) )
+ {
size_t cnt = config.GetLineCount();
- for(size_t i = 0; i < cnt; i++)
- if(config[i].StartsWith(wxT("Theme="), &theme))
+ for ( size_t i = 0; i < cnt; i++ )
+ {
+ if ( config[i].StartsWith(wxT("Theme="), &theme) )
break;
+ }
}
+
return theme;
}
if (mailcapStyles & wxMAILCAP_GNOME)
GetGnomeMimeInfo(sExtraDir);
- // read KDE tables
+ // read KDE tables which are never installed on OpenVMS
+#ifndef __VMS
if (mailcapStyles & wxMAILCAP_KDE)
GetKDEMimeInfo(sExtraDir);
+#endif
m_mailcapStylesInited |= mailcapStyles;
}
wxLogTrace(TRACE_MIME, wxT("--- Parsing mime.types file '%s' ---"),
strFileName.c_str());
- wxTextFile file(strFileName);
-#if defined(__WXGTK20__) && wxUSE_UNICODE
- if ( !file.Open(wxConvUTF8) )
-#else
+ wxMimeTextFile file(strFileName);
if ( !file.Open() )
-#endif
return false;
// the information we extract
wxLogTrace(TRACE_MIME, wxT("--- Parsing mailcap file '%s' ---"),
strFileName.c_str());
- wxTextFile file(strFileName);
-#if defined(__WXGTK20__) && wxUSE_UNICODE
- if ( !file.Open(wxConvUTF8) )
-#else
+ wxMimeTextFile file(strFileName);
if ( !file.Open() )
-#endif
return false;
// indices of MIME types (in m_aTypes) we already found in this file
if ( data.needsterminal )
{
- data.cmdOpen.Printf(wxT("xterm -e sh -c '%s'"),
- data.cmdOpen.c_str());
+ data.cmdOpen.insert(0, wxT("xterm -e sh -c '"));
+ data.cmdOpen.append(wxT("'"));
}
if ( !data.cmdOpen.empty() )