use wxMBConvUTF8(MAP_INVALID_UTF8_TO_OCTAL) for all access to MIME data files (extends fix of rev 1.77; replaces the change of rev 1.81); fixes spurious errors when reading KDE MIME files in Unicode builds

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43803 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2006-12-04 16:53:02 +00:00
parent abc912df18
commit d9bbb2d877

View File

@@ -68,17 +68,23 @@
// other standard headers // other standard headers
#include <ctype.h> #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 class wxMimeTextFile : public wxTextFile
{ {
public: public:
// constructors // constructors
wxMimeTextFile () : wxTextFile () {}; wxMimeTextFile () : wxTextFile () { }
wxMimeTextFile(const wxString& strFile) : wxTextFile(strFile) {}; 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; wxString sTest = sSearch;
sTest.MakeLower(); sTest.MakeLower();
@@ -135,6 +141,19 @@ public:
wxString sTmp = GetLine(i).AfterFirst(wxT('=')); wxString sTmp = GetLine(i).AfterFirst(wxT('='));
return sTmp; 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& conv)
{
return wxTextFile::OnRead(
wxMBConvUTF8(wxMBConvUTF8::MAP_INVALID_UTF8_TO_OCTAL));
}
}; };
// in case we're compiling in non-GUI mode // in case we're compiling in non-GUI mode
@@ -255,12 +274,8 @@ static bool IsKnownUnimportantField(const wxString& field);
void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename, void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
const wxArrayString& dirs) const wxArrayString& dirs)
{ {
wxTextFile textfile(filename); wxMimeTextFile textfile(filename);
#if defined(__WXGTK20__) && wxUSE_UNICODE
if ( !textfile.Open(wxMBConvUTF8(wxMBConvUTF8::MAP_INVALID_UTF8_TO_OCTAL)) )
#else
if ( !textfile.Open() ) if ( !textfile.Open() )
#endif
return; return;
wxLogTrace(TRACE_MIME, wxT("--- Opened Gnome file %s ---"), wxLogTrace(TRACE_MIME, wxT("--- Opened Gnome file %s ---"),
@@ -399,7 +414,7 @@ void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
void wxMimeTypesManagerImpl::LoadGnomeMimeTypesFromMimeFile(const wxString& filename) void wxMimeTypesManagerImpl::LoadGnomeMimeTypesFromMimeFile(const wxString& filename)
{ {
wxTextFile textfile(filename); wxMimeTextFile textfile(filename);
if ( !textfile.Open() ) if ( !textfile.Open() )
return; return;
@@ -749,17 +764,13 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase,
const wxArrayString& icondirs) const wxArrayString& icondirs)
{ {
wxFileName fullname(dirbase, filename); 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"), wxLogTrace(TRACE_MIME, wxT("loading KDE file %s"),
fullname.GetFullPath().c_str()); fullname.GetFullPath().c_str());
wxMimeTextFile file;
if ( !file.Open(fullname.GetFullPath()) )
return;
wxMimeTypeCommands * entry = new wxMimeTypeCommands; wxMimeTypeCommands * entry = new wxMimeTypeCommands;
wxArrayString sExts; wxArrayString sExts;
wxString mimetype, mime_desc, strIcon; wxString mimetype, mime_desc, strIcon;
@@ -939,17 +950,12 @@ void wxMimeTypesManagerImpl::LoadKDELinkFilesFromDir(const wxString& dirname,
// Read a KDE .desktop file of type 'Application' // Read a KDE .desktop file of type 'Application'
void wxMimeTypesManagerImpl::LoadKDEApp(const wxString& filename) 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()); 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. // Here, only type 'Application' should be considered.
int nIndex = file.pIndexOf( wxT("Type=") ); int nIndex = file.pIndexOf( wxT("Type=") );
if (nIndex != wxNOT_FOUND && if (nIndex != wxNOT_FOUND &&
@@ -1086,13 +1092,17 @@ static wxString ReadPathFromKDEConfig(const wxString& request)
static wxString GetKDEThemeInFile(const wxFileName& filename) static wxString GetKDEThemeInFile(const wxFileName& filename)
{ {
wxString theme; wxString theme;
wxTextFile config; wxMimeTextFile config;
if(filename.FileExists() && config.Open( filename.GetFullPath() )) { if ( filename.FileExists() && config.Open(filename.GetFullPath()) )
{
size_t cnt = config.GetLineCount(); size_t cnt = config.GetLineCount();
for(size_t i = 0; i < cnt; i++) for ( size_t i = 0; i < cnt; i++ )
if(config[i].StartsWith(wxT("Theme="), &theme)) {
if ( config[i].StartsWith(wxT("Theme="), &theme) )
break; break;
}
} }
return theme; return theme;
} }
@@ -2246,12 +2256,8 @@ bool wxMimeTypesManagerImpl::ReadMimeTypes(const wxString& strFileName)
wxLogTrace(TRACE_MIME, wxT("--- Parsing mime.types file '%s' ---"), wxLogTrace(TRACE_MIME, wxT("--- Parsing mime.types file '%s' ---"),
strFileName.c_str()); strFileName.c_str());
wxTextFile file(strFileName); wxMimeTextFile file(strFileName);
#if defined(__WXGTK20__) && wxUSE_UNICODE
if ( !file.Open(wxConvUTF8) )
#else
if ( !file.Open() ) if ( !file.Open() )
#endif
return false; return false;
// the information we extract // the information we extract
@@ -2543,12 +2549,8 @@ bool wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName,
wxLogTrace(TRACE_MIME, wxT("--- Parsing mailcap file '%s' ---"), wxLogTrace(TRACE_MIME, wxT("--- Parsing mailcap file '%s' ---"),
strFileName.c_str()); strFileName.c_str());
wxTextFile file(strFileName); wxMimeTextFile file(strFileName);
#if defined(__WXGTK20__) && wxUSE_UNICODE
if ( !file.Open(wxConvUTF8) )
#else
if ( !file.Open() ) if ( !file.Open() )
#endif
return false; return false;
// indices of MIME types (in m_aTypes) we already found in this file // indices of MIME types (in m_aTypes) we already found in this file