X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1dfeae4c133eb6f75c570b7e19478f42082ac08a..3f239e37605aa38b26b3954565b865600a4152aa:/src/unix/mimetype.cpp diff --git a/src/unix/mimetype.cpp b/src/unix/mimetype.cpp index 7da4abbd51..04110d67c2 100644 --- a/src/unix/mimetype.cpp +++ b/src/unix/mimetype.cpp @@ -68,17 +68,23 @@ // other standard headers #include -// 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(); @@ -137,9 +143,6 @@ public: } }; -// in case we're compiling in non-GUI mode -class WXDLLEXPORT wxIcon; - // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -255,12 +258,8 @@ static bool IsKnownUnimportantField(const wxString& field); 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 ---"), @@ -399,7 +398,7 @@ void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename, void wxMimeTypesManagerImpl::LoadGnomeMimeTypesFromMimeFile(const wxString& filename) { - wxTextFile textfile(filename); + wxMimeTextFile textfile(filename); if ( !textfile.Open() ) return; @@ -496,6 +495,9 @@ void wxMimeTypesManagerImpl::LoadGnomeMimeFilesFromDir( wxString dirname = dirbase; dirname << wxT("/mime-info"); + // Don't complain if we don't have permissions to read - it confuses users + wxLogNull logNull; + if ( !wxDir::Exists(dirname) ) return; @@ -749,17 +751,13 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase, 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; @@ -892,6 +890,10 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeType(const wxString& dirbase, { wxFileName dirname(dirbase, wxEmptyString); dirname.AppendDir(subdir); + + // Don't complain if we don't have permissions to read - it confuses users + wxLogNull logNull; + wxDir dir(dirname.GetPath()); if(! dir.IsOpened()) return; @@ -919,6 +921,9 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeType(const wxString& dirbase, void wxMimeTypesManagerImpl::LoadKDELinkFilesFromDir(const wxString& dirname, const wxArrayString& icondirs) { + // Don't complain if we don't have permissions to read - it confuses users + wxLogNull logNull; + if(! wxDir::Exists(dirname)) return; @@ -939,17 +944,12 @@ void wxMimeTypesManagerImpl::LoadKDELinkFilesFromDir(const wxString& dirname, // 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 && @@ -1013,7 +1013,7 @@ void wxMimeTypesManagerImpl::LoadKDEApp(const wxString& filename) wxStringTokenizer tokenizer(mimetypes, _T(";")); while(tokenizer.HasMoreTokens()) { wxString mimetype = tokenizer.GetNextToken().Lower(); - int nIndex = m_aTypes.Index(mimetype); + nIndex = m_aTypes.Index(mimetype); if(nIndex != wxNOT_FOUND) { // is this a known MIME type? wxMimeTypeCommands* entry = m_aEntries[nIndex]; entry->AddOrReplaceVerb(wxT("open"), sCmd); @@ -1023,6 +1023,9 @@ void wxMimeTypesManagerImpl::LoadKDEApp(const wxString& filename) void wxMimeTypesManagerImpl::LoadKDEAppsFilesFromDir(const wxString& dirname) { + // Don't complain if we don't have permissions to read - it confuses users + wxLogNull logNull; + if(! wxDir::Exists(dirname)) return; wxDir dir(dirname); @@ -1077,7 +1080,7 @@ static wxString ReadPathFromKDEConfig(const wxString& request) 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; } @@ -1086,13 +1089,17 @@ static wxString ReadPathFromKDEConfig(const wxString& request) 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; } @@ -1101,7 +1108,7 @@ static wxString GetKDEThemeInFile(const wxFileName& filename) 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") ); @@ -1112,7 +1119,7 @@ static wxString GetKDETheme(const wxArrayString& basedirs) } // 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()) { @@ -1135,7 +1142,7 @@ static void GetKDEIconDirs(const wxArrayString& basedirs, 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") ); @@ -1147,7 +1154,7 @@ static void GetKDEIconDirs(const wxArrayString& basedirs, } // 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()) { @@ -1168,7 +1175,7 @@ static void GetKDEIconDirs(const wxArrayString& basedirs, 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") ); @@ -1177,7 +1184,7 @@ static void GetKDEMimeDirs(const wxArrayString& basedirs, } // 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()) { @@ -1196,7 +1203,7 @@ static void GetKDEMimeDirs(const wxArrayString& basedirs, 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") ); @@ -1205,7 +1212,7 @@ static void GetKDEAppsDirs(const wxArrayString& basedirs, } // 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()) { @@ -1357,14 +1364,15 @@ size_t wxFileTypeImpl::GetAllCommands(wxArrayString *verbs, 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() ) { @@ -1374,7 +1382,7 @@ bool wxFileTypeImpl::GetExtensions(wxArrayString& extensions) //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('.') ) @@ -1415,14 +1423,27 @@ wxFileTypeImpl::SetCommand(const wxString& cmd, 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; } @@ -1441,23 +1462,28 @@ bool wxFileTypeImpl::SetDefaultIcon(const wxString& strIcon, int WXUNUSED(index) 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; } @@ -1502,9 +1528,11 @@ void wxMimeTypesManagerImpl::Initialize(int mailcapStyles, 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; } @@ -2071,10 +2099,10 @@ int wxMimeTypesManagerImpl::AddToMimeData(const wxString& strType, } // 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; } @@ -2132,7 +2160,7 @@ wxFileType * wxMimeTypesManagerImpl::GetFileTypeFromMimeType(const wxString& mim 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 ) && @@ -2246,12 +2274,8 @@ bool wxMimeTypesManagerImpl::ReadMimeTypes(const wxString& strFileName) 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 @@ -2462,8 +2486,7 @@ wxMimeTypesManagerImpl::ProcessOtherMailcapField(MailcapLineData& data, } // 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('=')), @@ -2543,12 +2566,8 @@ bool wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName, 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 @@ -2591,8 +2610,7 @@ bool wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName, Field_Type, Field_OpenCmd, Field_Other - } - currentToken = Field_Type; + } currentToken = Field_Type; // the flags and field values on the current line MailcapLineData data; @@ -2743,8 +2761,8 @@ bool wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName, 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() ) @@ -2849,10 +2867,10 @@ bool wxMimeTypesManagerImpl::Unassociate(wxFileType *ft) } } // 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; }