X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2b293fc78f342cedba6eec03d419d2e96e302fed..3a5bcc4db0851bf8cd3063917511b0b17c7f9679:/src/unix/mimetype.cpp diff --git a/src/unix/mimetype.cpp b/src/unix/mimetype.cpp index f194935891..367879ce18 100644 --- a/src/unix/mimetype.cpp +++ b/src/unix/mimetype.cpp @@ -6,7 +6,7 @@ // Created: 23.09.98 // RCS-ID: $Id$ // Copyright: (c) 1998 Vadim Zeitlin -// Licence: wxWindows license (part of wxExtra library) +// Licence: wxWindows licence (part of wxExtra library) ///////////////////////////////////////////////////////////////////////////// // known bugs; there may be others!! chris elliott, biol75@york.ac.uk 27 Mar 01 @@ -40,7 +40,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "mimetype.h" #endif @@ -59,10 +59,6 @@ #ifndef WX_PRECOMP #include "wx/string.h" - #if wxUSE_GUI - #include "wx/icon.h" - - #endif #endif //WX_PRECOMP @@ -77,6 +73,9 @@ #include "wx/dir.h" #include "wx/utils.h" #include "wx/tokenzr.h" +#include "wx/iconloc.h" +#include "wx/filename.h" +#include "wx/fileconf.h" #include "wx/unix/mimetype.h" @@ -574,17 +573,19 @@ void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename, else if (sTmp.Contains( wxT("icon_filename=") ) ) { curIconFile = sTmp.AfterFirst(wxT('=')); + if (!wxFileExists(curIconFile)) { size_t nDirs = dirs.GetCount(); for (size_t nDir = 0; nDir < nDirs; nDir++) { - wxString newFile; - newFile.Printf(wxT("%s/pixmaps/document-icons/%s.png"), - dirs[nDir].c_str(), - curIconFile.c_str()); - if (wxFileExists(newFile)) - curIconFile = newFile; + wxFileName newFile( curIconFile ); + newFile.SetPath( dirs[nDir] ); + newFile.AppendDir( wxT("pixmaps") ); + newFile.AppendDir( wxT("document-icons") ); + newFile.SetExt( wxT("png") ); + if (newFile.FileExists()) + curIconFile = newFile.GetFullPath(); } } } @@ -631,11 +632,9 @@ void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename, // ignore blank lines nLine ++; } // end of while, save any data + if (! curMimeType.empty()) - { AddToMimeData ( curMimeType, curIconFile, entry, strExtensions, strDesc); - } - } @@ -643,14 +642,12 @@ void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename, void wxMimeTypesManagerImpl::LoadGnomeMimeTypesFromMimeFile(const wxString& filename) { wxTextFile textfile(filename); -#if defined(__WXGTK20__) && wxUSE_UNICODE - if ( !textfile.Open( wxConvUTF8) ) -#else if ( !textfile.Open() ) -#endif return; - wxLogTrace(TRACE_MIME, wxT("--- Opened Gnome file %s ---"), - filename.c_str()); + + wxLogTrace(TRACE_MIME, + wxT("--- Opened Gnome file %s ---"), + filename.c_str()); // values for the entry being parsed wxString curMimeType, curExtList; @@ -679,9 +676,10 @@ void wxMimeTypesManagerImpl::LoadGnomeMimeTypesFromMimeFile(const wxString& file // end of the entry if ( !!curMimeType && !!curExtList ) { - wxLogTrace(TRACE_MIME, wxT("--- At end of Gnome file finding mimetype %s ---"), - curMimeType.c_str()); - + wxLogTrace(TRACE_MIME, + wxT("--- At end of Gnome file finding mimetype %s ---"), + curMimeType.c_str()); + AddMimeTypeInfo(curMimeType, curExtList, wxEmptyString); } @@ -702,20 +700,20 @@ void wxMimeTypesManagerImpl::LoadGnomeMimeTypesFromMimeFile(const wxString& file // this is a field=value ling pc++; // skip leading TAB - static const int lenField = 4; // strlen("ext:") - if ( wxStrncmp(pc, wxT("ext:"), lenField) == 0 ) + static const int lenField = 5; // strlen("ext: ") + if ( wxStrncmp(pc, wxT("ext: "), lenField) == 0 ) { - // skip ' ' which follows and take everything left until the end - // of line - curExtList = pc + lenField + 1; + // skip it and take everything left until the end of line + curExtList = pc + lenField; } //else: some other field, we don't care } else { // this is the start of the new section - wxLogTrace(TRACE_MIME, wxT("--- In Gnome file finding mimetype %s ---"), - curMimeType.c_str()); + wxLogTrace(TRACE_MIME, + wxT("--- In Gnome file finding mimetype %s ---"), + curMimeType.c_str()); if (! curMimeType.empty()) AddMimeTypeInfo(curMimeType, curExtList, wxEmptyString); @@ -739,7 +737,7 @@ void wxMimeTypesManagerImpl::LoadGnomeMimeFilesFromDir( wxString dirname = dirbase; dirname << wxT("/mime-info"); - + if ( !wxDir::Exists(dirname) ) return; @@ -751,7 +749,8 @@ void wxMimeTypesManagerImpl::LoadGnomeMimeFilesFromDir( dirname += wxT('/'); wxString filename; - bool cont = dir.GetFirst(&filename, _T("*.mime"), wxDIR_FILES); + bool cont; + cont = dir.GetFirst(&filename, _T("*.mime"), wxDIR_FILES); while ( cont ) { LoadGnomeMimeTypesFromMimeFile(dirname + filename); @@ -766,21 +765,65 @@ void wxMimeTypesManagerImpl::LoadGnomeMimeFilesFromDir( cont = dir.GetNext(&filename); } -} + // Hack alert: We scan all icons and deduce the + // mime-type from the file name. + dirname = dirbase; + dirname << wxT("/pixmaps/document-icons"); + + // these are always empty in this file + wxArrayString strExtensions; + wxString strDesc; + + if ( !wxDir::Exists(dirname) ) + { + // Jst test for default GPE dir also + dirname = wxT("/usr/share/gpe/pixmaps/default/filemanager/document-icons"); + + if ( !wxDir::Exists(dirname) ) + return; + } + wxDir dir2( dirname ); + cont = dir2.GetFirst(&filename, wxT("gnome-*.png"), wxDIR_FILES); + while ( cont ) + { + wxString mimeType = filename; + mimeType.Remove( 0, 6 ); // remove "gnome-" + mimeType.Remove( mimeType.Len()-4, 4 ); // remove ".png" + int pos = mimeType.Find( wxT("-") ); + if (pos != wxNOT_FOUND) + { + mimeType.SetChar( pos, wxT('/') ); + wxString iconFile = dirname; + iconFile << wxT("/"); + iconFile << filename; + AddToMimeData ( mimeType, iconFile, NULL, strExtensions, strDesc, TRUE ); + } + + cont = dir2.GetNext(&filename); + } +} void wxMimeTypesManagerImpl::GetGnomeMimeInfo(const wxString& sExtraDir) { wxArrayString dirs; + + wxString gnomedir = wxGetenv( wxT("GNOMEDIR") );; + if (!gnomedir.empty()) + { + gnomedir << wxT("/share"); + dirs.Add( gnomedir ); + } + dirs.Add(wxT("/usr/share")); dirs.Add(wxT("/usr/local/share")); - - wxString gnomedir; - wxGetHomeDir( &gnomedir ); - gnomedir += wxT("/.gnome"); + + gnomedir = wxGetHomeDir(); + gnomedir << wxT("/.gnome"); dirs.Add( gnomedir ); + if (!sExtraDir.empty()) dirs.Add( sExtraDir ); size_t nDirs = dirs.GetCount(); @@ -808,20 +851,21 @@ void wxMimeTypesManagerImpl::GetGnomeMimeInfo(const wxString& sExtraDir) // kde writing; see http://webcvs.kde.org/cgi-bin/cvsweb.cgi/~checkout~/kdelibs/kio/DESKTOP_ENTRY_STANDARD // for now write to .kdelnk but should eventually do .desktop instead (in preference??) -bool wxMimeTypesManagerImpl::CheckKDEDirsExist ( const wxString & sOK, const wxString & sTest ) - - { +bool wxMimeTypesManagerImpl::CheckKDEDirsExist ( const wxString &sOK, const wxString &sTest ) +{ if (sTest.empty()) - { - if (wxDir::Exists(sOK)) return TRUE; - else return FALSE; - } + { + if (wxDir::Exists(sOK)) + return TRUE; + else + return FALSE; + } else - { - wxString sStart = sOK + wxT("/") + sTest.BeforeFirst(wxT('/')); - if (!wxDir::Exists(sStart)) wxMkdir(sStart); - wxString sEnd = sTest.AfterFirst(wxT('/')); - return CheckKDEDirsExist(sStart, sEnd); + { + wxString sStart = sOK + wxT("/") + sTest.BeforeFirst(wxT('/')); + if (!wxDir::Exists(sStart)) wxMkdir(sStart); + wxString sEnd = sTest.AfterFirst(wxT('/')); + return CheckKDEDirsExist(sStart, sEnd); } } @@ -929,8 +973,6 @@ bool wxMimeTypesManagerImpl::WriteKDEMimeFile(int index, bool delete_index) appoutfile.Close (); return bTemp; - - } void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase, @@ -1007,7 +1049,6 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase, } sExts.Add(mime_extension); - // ok, now we can take care of icon: nIndex = file.pIndexOf(_T("Icon=")); @@ -1016,6 +1057,8 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase, strIcon = file.GetCmd(nIndex); wxLogTrace(TRACE_MIME, wxT(" icon %s"), strIcon.c_str()); //it could be the real path, but more often a short name + + if (!wxFileExists(strIcon)) { // icon is just the short name @@ -1025,12 +1068,17 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase, // in many locations, at least ~/.kde and $KDEDIR size_t nDir, nDirs = icondirs.GetCount(); for ( nDir = 0; nDir < nDirs; nDir++ ) - if (wxFileExists(icondirs[nDir] + strIcon)) + { + wxFileName fnameIcon( strIcon ); + wxFileName fname( icondirs[nDir], fnameIcon.GetName() ); + fname.SetExt( wxT("png") ); + if (fname.FileExists()) { - strIcon.Prepend(icondirs[nDir]); + strIcon = fname.GetFullPath(); wxLogTrace(TRACE_MIME, wxT(" iconfile %s"), strIcon.c_str()); break; } + } } } } @@ -1123,14 +1171,86 @@ void wxMimeTypesManagerImpl::GetKDEMimeInfo(const wxString& sExtraDir) { wxArrayString dirs; wxArrayString icondirs; + + // the variable $KDEDIR is set when KDE is running + wxString kdedir = wxGetenv( wxT("KDEDIR") ); + + if (!kdedir.empty()) + { + // $(KDEDIR)/share/config/kdeglobals holds info + // the current icons theme + wxFileName configFile( kdedir, wxEmptyString ); + configFile.AppendDir( wxT("share") ); + configFile.AppendDir( wxT("config") ); + configFile.SetName( wxT("kdeglobals") ); + + if (configFile.FileExists()) + { + wxFileConfig config( wxEmptyString, wxEmptyString, configFile.GetFullPath() ); + // $(KDEDIR)/share/config -> $(KDEDIR)/share + configFile.RemoveDir( configFile.GetDirCount()-1 ); + // $(KDEDIR)/share/ -> $(KDEDIR)/share/icons + configFile.AppendDir( wxT("icons") ); + + // Check for entry + config.SetPath( wxT("Icons") ); + wxString theme; + if (config.Read( wxT("Theme"), &theme )) + configFile.AppendDir( theme ); + else + configFile.AppendDir( wxT("default.kde") ); + } + else + { + // $(KDEDIR)/share/config -> $(KDEDIR)/share + configFile.RemoveDir( configFile.GetDirCount()-1 ); + // $(KDEDIR)/share/ -> $(KDEDIR)/share/icons + configFile.AppendDir( wxT("icons") ); + // $(KDEDIR)/share/icons -> $(KDEDIR)/share/icons/default.kde + configFile.AppendDir( wxT("default.kde") ); + } + + configFile.SetName( wxEmptyString ); + configFile.AppendDir( wxT("32x32") ); + configFile.AppendDir( wxT("mimetypes") ); + + // Just try a few likely icons theme names + + int pos = configFile.GetDirCount()-3; + + if (!wxDir::Exists(configFile.GetPath())) + { + configFile.RemoveDir( pos ); + configFile.InsertDir( pos, wxT("default.kde") ); + } + + if (!wxDir::Exists(configFile.GetPath())) + { + configFile.RemoveDir( pos ); + configFile.InsertDir( pos, wxT("default") ); + } + + if (!wxDir::Exists(configFile.GetPath())) + { + configFile.RemoveDir( pos ); + configFile.InsertDir( pos, wxT("crystalsvg") ); + } + + if (!wxDir::Exists(configFile.GetPath())) + { + configFile.RemoveDir( pos ); + configFile.InsertDir( pos, wxT("crystal") ); + } + + if (wxDir::Exists(configFile.GetPath())) + icondirs.Add( configFile.GetFullPath() ); + } // settings in ~/.kde have maximal priority dirs.Add(wxGetHomeDir() + wxT("/.kde/share")); icondirs.Add(wxGetHomeDir() + wxT("/.kde/share/icons/")); - // the variable KDEDIR is set when KDE is running - const wxChar *kdedir = wxGetenv( wxT("KDEDIR") ); - if ( kdedir ) + if (kdedir) { dirs.Add( wxString(kdedir) + wxT("/share") ); icondirs.Add( wxString(kdedir) + wxT("/share/icons/") ); @@ -1172,12 +1292,9 @@ wxString wxFileTypeImpl::GetExpandedCommand(const wxString & verb, const wxFileT return wxFileType::ExpandCommand(sTmp, params); } -bool wxFileTypeImpl::GetIcon(wxIcon *icon, - wxString *iconFile /*= NULL */, - int *iconIndex /*= NULL*/) const +bool wxFileTypeImpl::GetIcon(wxIconLocation *iconLoc) const { -#if wxUSE_GUI wxString sTmp; size_t i = 0; while ( (i < m_index.GetCount() ) && sTmp.empty() ) @@ -1185,25 +1302,15 @@ bool wxFileTypeImpl::GetIcon(wxIcon *icon, sTmp = m_manager->m_aIcons[m_index[i]]; i ++; } - if ( sTmp.empty () ) return FALSE; - - wxIcon icn; - - if (sTmp.Right(4).MakeUpper() == _T(".XPM")) - icn = wxIcon(sTmp); - else - icn = wxIcon(sTmp, wxBITMAP_TYPE_ANY); + if ( sTmp.empty () ) + return FALSE; - if ( icn.Ok() ) + if ( iconLoc ) { - *icon = icn; - if (iconFile) *iconFile = sTmp; - if (iconIndex) *iconIndex = 0; - return TRUE; + iconLoc->SetFileName(sTmp); } -#endif // wxUSE_GUI - return FALSE; + return TRUE; } @@ -1358,6 +1465,26 @@ wxMimeTypesManagerImpl::wxMimeTypesManagerImpl() m_mailcapStylesInited = 0; } +void wxMimeTypesManagerImpl::InitIfNeeded() +{ + if ( !m_initialized ) + { + // set the flag first to prevent recursion + m_initialized = TRUE; + +#if 0 + wxString wm = wxGetenv( wxT("WINDOWMANAGER") ); + + if (wm.Find( wxT("kde") ) != wxNOT_FOUND) + Initialize( wxMAILCAP_KDE|wxMAILCAP_STANDARD ); + else if (wm.Find( wxT("gnome") ) != wxNOT_FOUND) + Initialize( wxMAILCAP_GNOME|wxMAILCAP_STANDARD ); + else +#endif + Initialize(); + } +} + // read system and user mailcaps and other files void wxMimeTypesManagerImpl::Initialize(int mailcapStyles, const wxString& sExtraDir) @@ -1368,11 +1495,11 @@ void wxMimeTypesManagerImpl::Initialize(int mailcapStyles, GetMimeInfo(sExtraDir); // read GNOME tables - if ( mailcapStyles & wxMAILCAP_GNOME) + if (mailcapStyles & wxMAILCAP_GNOME) GetGnomeMimeInfo(sExtraDir); // read KDE tables - if ( mailcapStyles & wxMAILCAP_KDE) + if (mailcapStyles & wxMAILCAP_KDE) GetKDEMimeInfo(sExtraDir); m_mailcapStylesInited |= mailcapStyles; @@ -1833,7 +1960,8 @@ int wxMimeTypesManagerImpl::AddToMimeData(const wxString& strType, m_aEntries.Add(entry ? entry : new wxMimeTypeCommands); // change nIndex so we can use it below to add the extensions - nIndex = m_aExtensions.Add(wxEmptyString); + m_aExtensions.Add(wxEmptyString); + nIndex = m_aExtensions.size() - 1; m_aDescriptions.Add(strDesc); } @@ -2189,7 +2317,7 @@ bool wxMimeTypesManagerImpl::ReadMimeTypes(const wxString& strFileName) else if ( strLHS == wxT("exts") ) { strExtensions = strRHS; } - else if ( strLHS != _T("icon") ) + else if ( strLHS == _T("icon") ) { // this one is simply ignored: it usually refers to Netscape // built in icons which are useless for us anyhow