wxString sTmp = GetLine(i).AfterFirst(wxT('='));
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& WXUNUSED(conv))
- {
- return wxTextFile::OnRead(
- wxMBConvUTF8(wxMBConvUTF8::MAP_INVALID_UTF8_TO_PUA));
- }
};
-// in case we're compiling in non-GUI mode
-class WXDLLEXPORT wxIcon;
-
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
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;
{
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;
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;
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);
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);
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 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('.') )
GetKDEMimeInfo(sExtraDir);
#endif
+ // Load desktop files for Gnome, and then override them with the Gnome defaults.
+ // We will override them one desktop file at a time, rather
+ // than one mime type at a time, but it should be a reasonable
+ // heuristic.
+ if (mailcapStyles & wxMAILCAP_GNOME)
+ {
+ wxString xdgDataHome = wxGetenv(wxT("XDG_DATA_HOME"));
+ if ( xdgDataHome.empty() )
+ xdgDataHome = wxGetHomeDir() + wxT("/.local/share");
+ wxString xdgDataDirs = wxGetenv(wxT("XDG_DATA_DIRS"));
+ if ( xdgDataDirs.empty() )
+ xdgDataDirs = wxT("/usr/local/share:/usr/share:/usr/share/gnome");
+ wxArrayString dirs;
+
+ wxStringTokenizer tokenizer(xdgDataDirs, wxT(":"));
+ while ( tokenizer.HasMoreTokens() )
+ {
+ wxString p = tokenizer.GetNextToken();
+ dirs.Add(p);
+ }
+ dirs.insert(dirs.begin(), xdgDataHome);
+
+ wxString defaultsList;
+ size_t i;
+ for (i = 0; i < dirs.GetCount(); i++)
+ {
+ wxString f(dirs[i] + wxT("/applications/defaults.list"));
+ if (wxFileExists(f))
+ {
+ defaultsList = f;
+ break;
+ }
+ }
+
+ // Load application files and associate them to corresponding mime types.
+ size_t nDirs = dirs.GetCount();
+ for (size_t nDir = 0; nDir < nDirs; nDir++)
+ {
+ wxString dirStr(dirs[nDir] + wxT("/applications"));
+ LoadKDEAppsFilesFromDir(dirStr);
+ }
+
+ if (!defaultsList.IsEmpty())
+ {
+ wxArrayString deskTopFilesSeen;
+
+ wxMimeTextFile textfile(defaultsList);
+ if ( textfile.Open() )
+ {
+ int nIndex = textfile.pIndexOf( wxT("[Default Applications]") );
+ if (nIndex != wxNOT_FOUND)
+ {
+ for (i = nIndex+1; i < textfile.GetLineCount(); i++)
+ {
+ if (textfile[i].Find(wxT("=")) != wxNOT_FOUND)
+ {
+ wxString mimeType = textfile.GetVerb(i);
+ wxString desktopFile = textfile.GetCmd(i);
+
+ if (deskTopFilesSeen.Index(desktopFile) == wxNOT_FOUND)
+ {
+ deskTopFilesSeen.Add(desktopFile);
+ size_t j;
+ for (j = 0; j < dirs.GetCount(); j++)
+ {
+ wxString desktopPath(dirs[j] + wxT("/applications/") + desktopFile);
+ if (wxFileExists(desktopPath))
+ {
+ LoadKDEApp(desktopPath);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
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 ) &&
}
// 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('=')),
Field_Type,
Field_OpenCmd,
Field_Other
- }
- currentToken = Field_Type;
+ } currentToken = Field_Type;
// the flags and field values on the current line
MailcapLineData data;
}
}
// 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;
}