X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/05f616efaac1f5b9516afd85f44f9e8ee1bfd8f8..57bf907d8e45ced18486d74c04f41c06034b7e65:/src/unix/mimetype.cpp diff --git a/src/unix/mimetype.cpp b/src/unix/mimetype.cpp index dd76cf2a6a..c9d7bc93ad 100644 --- a/src/unix/mimetype.cpp +++ b/src/unix/mimetype.cpp @@ -45,28 +45,28 @@ class wxMimeTextFile { public: - wxMimeTextFile() + wxMimeTextFile() { } - + wxMimeTextFile(const wxString& fname) { m_fname = fname; } - + bool Open() { wxFFile file( m_fname ); if (!file.IsOpened()) return false; - + size_t size = file.Length(); wxCharBuffer buffer( size ); file.Read( (void*) (const char*) buffer, size ); - + // Check for valid UTF-8 here? wxString all = wxString::FromUTF8( buffer, size ); - + wxStringTokenizer tok( all, "\n" ); while (tok.HasMoreTokens()) { @@ -77,7 +77,7 @@ public: } return true; } - + unsigned int GetLineCount() const { return m_text.GetCount(); } wxString &GetLine( unsigned int line ) { return m_text[line]; } @@ -116,7 +116,7 @@ public: wxString sTmp = GetLine(i).AfterFirst(wxT('=')); return sTmp; } - + private: wxArrayString m_text; wxString m_fname; @@ -138,7 +138,7 @@ void wxMimeTypesManagerImpl::LoadXDGApp(const wxString& filename) wxMimeTextFile file(filename); if ( !file.Open() ) return; - + // Here, only type 'Application' should be considered. int nIndex = file.pIndexOf( "Type=" ); if (nIndex != wxNOT_FOUND && file.GetCmd(nIndex) != "application") @@ -230,10 +230,10 @@ void wxMimeTypesManagerImpl::LoadXDGAppsFilesFromDir(const wxString& dirname) cont = dir.GetNext(&filename); } -#if 0 +#if 0 // RR: I'm not sure this makes any sense. On my system we'll just // scan the YAST2 and other useless directories - + // Look recursively into subdirs cont = dir.GetFirst(&filename, wxEmptyString, wxDIR_DIRS); while (cont) @@ -249,13 +249,27 @@ void wxMimeTypesManagerImpl::LoadXDGAppsFilesFromDir(const wxString& dirname) void wxMimeTypesManagerImpl::LoadXDGGlobs(const wxString& filename) { + if ( !wxFileName::FileExists(filename) ) + return; + wxLogTrace(TRACE_MIME, wxT("loading XDG globs file from %s"), filename.c_str()); wxMimeTextFile file(filename); if ( !file.Open() ) return; - // Parse it here + size_t i; + for (i = 0; i < file.GetLineCount(); i++) + { + wxStringTokenizer tok( file.GetLine(i), ":" ); + wxString mime = tok.GetNextToken(); + wxString ext = tok.GetNextToken(); + ext.Remove( 0, 2 ); + wxArrayString exts; + exts.Add( ext ); + + AddToMimeData(mime, wxEmptyString, NULL, exts, wxEmptyString, true ); + } } // ---------------------------------------------------------------------------- @@ -492,9 +506,9 @@ void wxMimeTypesManagerImpl::InitIfNeeded() { // set the flag first to prevent recursion m_initialized = true; - + wxString wm = wxTheApp->GetTraits()->GetDesktopEnvironment(); - + if (wm == wxT("KDE")) Initialize( wxMAILCAP_KDE ); else if (wm == wxT("GNOME")) @@ -517,6 +531,7 @@ void wxMimeTypesManagerImpl::Initialize(int mailcapStyles, // Read MIME type - extension associations LoadXDGGlobs( "/usr/share/mime/globs" ); + LoadXDGGlobs( "/usr/local/share/mime/globs" ); // Load desktop files for XDG, and then override them with the defaults. // We will override them one desktop file at a time, rather @@ -540,7 +555,7 @@ void wxMimeTypesManagerImpl::Initialize(int mailcapStyles, xdgDataDirs += ':'; xdgDataDirs += sExtraDir; } - + wxArrayString dirs; wxStringTokenizer tokenizer(xdgDataDirs, ":"); while ( tokenizer.HasMoreTokens() ) @@ -588,9 +603,8 @@ void wxMimeTypesManagerImpl::Initialize(int mailcapStyles, { if (textfile.GetLine(i).Find(wxT("=")) != wxNOT_FOUND) { - wxString mimeType = textfile.GetVerb(i); wxString desktopFile = textfile.GetCmd(i); - + if (deskTopFilesSeen.Index(desktopFile) == wxNOT_FOUND) { deskTopFilesSeen.Add(desktopFile); @@ -601,7 +615,7 @@ void wxMimeTypesManagerImpl::Initialize(int mailcapStyles, if (desktopPath.Last() != '/') desktopPath += '/'; desktopPath += "applications/"; desktopPath += desktopFile; - + if (wxFileExists(desktopPath)) LoadXDGApp(desktopPath); } @@ -830,7 +844,7 @@ wxFileType * wxMimeTypesManagerImpl::GetFileTypeFromMimeType(const wxString& mim // first look for an exact match int index = m_aTypes.Index(mimetype); - + if ( index != wxNOT_FOUND ) { fileType = new wxFileType;