// 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;
}
-};
-// in case we're compiling in non-GUI mode
-class WXDLLEXPORT wxIcon;
+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));
+ }
+};
// ----------------------------------------------------------------------------
// constants
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;
- if(! file.Open( fullname.GetFullPath() )) 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;
- if ( !file.Open(filename) ) 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 &&
wxString str;
wxArrayString output;
if(wxExecute(wxT("kde-config --path ")+request, output) == 0 &&
- output.Count() > 0)
+ output.GetCount() > 0)
str = output.Item(0);
return str;
}
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;
}
static wxString GetKDETheme(const wxArrayString& basedirs)
{
wxString theme;
- for(size_t i = 0; i < basedirs.Count(); i++) {
+ for(size_t i = 0; i < basedirs.GetCount(); i++) {
wxFileName filename(basedirs.Item(i), wxEmptyString);
filename.AppendDir( wxT("share") );
filename.AppendDir( wxT("config") );
}
// If $KDEDIRS and $KDEDIR were set, we try nothing more. Otherwise, we
// try to get the configuration file with 'kde-config'.
- if(basedirs.Count() > 1)
+ if(basedirs.GetCount() > 1)
return theme;
wxString paths = ReadPathFromKDEConfig(wxT("config"));
if(! paths.IsEmpty()) {
if(theme.IsEmpty())
theme = wxT("default.kde");
- for(size_t i = 0; i < basedirs.Count(); i++) {
+ for(size_t i = 0; i < basedirs.GetCount(); i++) {
wxFileName dirname(basedirs.Item(i), wxEmptyString);
dirname.AppendDir( wxT("share") );
dirname.AppendDir( wxT("icons") );
}
// If $KDEDIRS and $KDEDIR were not set, use 'kde-config'
- if(basedirs.Count() > 1)
+ if(basedirs.GetCount() > 1)
return;
wxString paths = ReadPathFromKDEConfig(wxT("icon"));
if(! paths.IsEmpty()) {
static void GetKDEMimeDirs(const wxArrayString& basedirs,
wxArrayString& mimedirs)
{
- for(size_t i = 0; i < basedirs.Count(); i++) {
+ for(size_t i = 0; i < basedirs.GetCount(); i++) {
wxFileName dirname(basedirs.Item(i), wxEmptyString);
dirname.AppendDir( wxT("share") );
dirname.AppendDir( wxT("mimelnk") );
}
// If $KDEDIRS and $KDEDIR were not set, use 'kde-config'
- if(basedirs.Count() > 1)
+ if(basedirs.GetCount() > 1)
return;
wxString paths = ReadPathFromKDEConfig(wxT("mime"));
if(! paths.IsEmpty()) {
static void GetKDEAppsDirs(const wxArrayString& basedirs,
wxArrayString& appsdirs)
{
- for(size_t i = 0; i < basedirs.Count(); i++) {
+ for(size_t i = 0; i < basedirs.GetCount(); i++) {
wxFileName dirname(basedirs.Item(i), wxEmptyString);
dirname.AppendDir( wxT("share") );
dirname.AppendDir( wxT("applnk") );
}
// If $KDEDIRS and $KDEDIR were not set, use 'kde-config'
- if(basedirs.Count() > 1)
+ if(basedirs.GetCount() > 1)
return;
wxString paths = ReadPathFromKDEConfig(wxT("apps"));
if(! paths.IsEmpty()) {
bool wxFileTypeImpl::GetExtensions(wxArrayString& extensions)
{
- wxString strExtensions = m_manager->GetExtension(m_index[0]);
+ const wxString strExtensions = m_manager->GetExtension(m_index[0]);
extensions.Empty();
// one extension in the space or comma-delimited list
wxString strExt;
- for ( const wxChar *p = strExtensions; /* nothing */; p++ )
+ wxString::const_iterator end = strExtensions.end();
+ for ( wxString::const_iterator p = strExtensions.begin(); /* nothing */; ++p )
{
- if ( *p == wxT(' ') || *p == wxT(',') || *p == wxT('\0') )
+ if ( p == end || *p == wxT(' ') || *p == wxT(',') )
{
if ( !strExt.empty() )
{
//else: repeated spaces
// (shouldn't happen, but it's not that important if it does happen)
- if ( *p == wxT('\0') )
+ if ( p == end )
break;
}
else if ( *p == wxT('.') )
wxMimeTypeCommands *entry = new wxMimeTypeCommands();
entry->Add(verb + wxT("=") + cmd + wxT(" %s "));
- bool ok = true;
+ bool ok = false;
size_t nCount = strTypes.GetCount();
for ( size_t i = 0; i < nCount; i++ )
{
- if (!m_manager->DoAssociation(strTypes[i], strIcon, entry, strExtensions, strDesc))
- ok = false;
+ if ( m_manager->DoAssociation
+ (
+ strTypes[i],
+ strIcon,
+ entry,
+ strExtensions,
+ strDesc
+ ) )
+ {
+ // DoAssociation() took ownership of entry, don't delete it below
+ ok = true;
+ }
}
+ if ( !ok )
+ delete entry;
+
return ok;
}
return false;
wxMimeTypeCommands *entry = new wxMimeTypeCommands();
- bool ok = true;
+ bool ok = false;
size_t nCount = strTypes.GetCount();
for ( size_t i = 0; i < nCount; i++ )
{
- if ( !m_manager->DoAssociation
- (
+ if ( m_manager->DoAssociation
+ (
strTypes[i],
strIcon,
entry,
strExtensions,
strDesc
- ) )
+ ) )
{
- ok = false;
+ // we don't need to free entry now, DoAssociation() took ownership
+ // of it
+ ok = true;
}
}
+ if ( !ok )
+ delete entry;
+
return ok;
}
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;
}
}
// check data integrity
- wxASSERT( m_aTypes.Count() == m_aEntries.Count() &&
- m_aTypes.Count() == m_aExtensions.Count() &&
- m_aTypes.Count() == m_aIcons.Count() &&
- m_aTypes.Count() == m_aDescriptions.Count() );
+ wxASSERT( m_aTypes.GetCount() == m_aEntries.GetCount() &&
+ m_aTypes.GetCount() == m_aExtensions.GetCount() &&
+ m_aTypes.GetCount() == m_aIcons.GetCount() &&
+ m_aTypes.GetCount() == m_aDescriptions.GetCount() );
return nIndex;
}
index = wxNOT_FOUND;
wxString strCategory = mimetype.BeforeFirst(wxT('/'));
- size_t nCount = m_aTypes.Count();
+ size_t nCount = m_aTypes.GetCount();
for ( size_t n = 0; n < nCount; n++ )
{
if ( (m_aTypes[n].BeforeFirst(wxT('/')) == strCategory ) &&
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
}
// is this something of the form foo=bar?
- const wxChar *pEq = wxStrchr(curField, wxT('='));
- if ( pEq != NULL )
+ if ( curField.find('=') != wxString::npos )
{
// split "LHS = RHS" in 2
wxString lhs = curField.BeforeFirst(wxT('=')),
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
Field_Type,
Field_OpenCmd,
Field_Other
- }
- currentToken = Field_Type;
+ } currentToken = Field_Type;
// the flags and field values on the current line
MailcapLineData data;
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() )
}
}
// check data integrity
- wxASSERT( m_aTypes.Count() == m_aEntries.Count() &&
- m_aTypes.Count() == m_aExtensions.Count() &&
- m_aTypes.Count() == m_aIcons.Count() &&
- m_aTypes.Count() == m_aDescriptions.Count() );
+ wxASSERT( m_aTypes.GetCount() == m_aEntries.GetCount() &&
+ m_aTypes.GetCount() == m_aExtensions.GetCount() &&
+ m_aTypes.GetCount() == m_aIcons.GetCount() &&
+ m_aTypes.GetCount() == m_aDescriptions.GetCount() );
return true;
}