// Created: 23.09.98
// RCS-ID: $Id$
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// 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
wxString gnomedir;
wxGetHomeDir( &gnomedir );
wxString sTmp = gnomedir;
- sTmp = sTmp + "/.gnome";
+ sTmp = sTmp + wxT("/.gnome");
if (! wxDir::Exists ( sTmp ) )
{
if (!wxMkdir ( sTmp ))
{
- wxFAIL_MSG (wxString ("Failed to create directory\n.gnome in \nCheckGnomeDirsExist") + sTmp );
+ wxLogError(_("Failed to create directory %s/.gnome."), sTmp.c_str());
return FALSE;
}
}
- sTmp = sTmp + "/mime-info";
+ sTmp = sTmp + wxT("/mime-info");
if (! wxDir::Exists ( sTmp ) )
{
if (!wxMkdir ( sTmp ))
{
- wxFAIL_MSG (wxString ("Failed to create directory\nmime-info in \nCheckGnomeDirsExist") + sTmp );
+ wxLogError(_("Failed to create directory %s/mime-info."), sTmp.c_str());
return FALSE;
}
}
wxString gnomedir;
wxGetHomeDir( &gnomedir );
- wxMimeTextFile outfile ( gnomedir + "/.gnome/mime-info/user.keys");
+ wxMimeTextFile outfile ( gnomedir + wxT("/.gnome/mime-info/user.keys"));
// if this fails probably Gnome is not installed ??
// create it anyway as a private mime store
+#if defined(__WXGTK20__) && wxUSE_UNICODE
+ if (! outfile.Open ( wxConvUTF8) )
+#else
if (! outfile.Open () )
+#endif
{
if (delete_index) return FALSE;
if (!CheckGnomeDirsExist() ) return FALSE;
}
//sOld should also contain the icon
if ( !m_aIcons[index].empty() )
- sOld.AddOrReplaceVerb ( wxT( "icon-filename"), m_aIcons[index] );
+ sOld.AddOrReplaceVerb ( wxT("icon-filename"), m_aIcons[index] );
for (i=0; i < sOld.GetCount(); i++)
{
sTmp = sOld.GetVerbCmd(i);
sTmp.Replace( wxT("%s"), wxT("%f") );
- sTmp = wxT ( "\t") + sTmp;
+ sTmp = wxT("\t") + sTmp;
nIndex ++;
outfile.InsertLine ( sTmp, nIndex );
}
wxString gnomedir;
wxGetHomeDir( &gnomedir );
- wxMimeTextFile outfile ( gnomedir + "/.gnome/mime-info/user.mime");
+ wxMimeTextFile outfile ( gnomedir + wxT("/.gnome/mime-info/user.mime"));
// if this fails probably Gnome is not installed ??
// create it anyway as a private mime store
if (! outfile.Open () )
if ( nIndex == wxNOT_FOUND )
{
outfile.AddLine ( strType );
- outfile.AddLine ( wxT( "\text:") + m_aExtensions.Item(index) );
+ outfile.AddLine ( wxT("\text:") + m_aExtensions.Item(index) );
}
else
{
else
{// check for next line being the right one to replace ??
wxString sOld = outfile.GetLine(nIndex+1);
- if (sOld.Contains(wxT("\text: ")))
+ if (sOld.Contains( wxT("\text: ")))
{
- outfile.GetLine(nIndex+1) = wxT( "\text: ") + m_aExtensions.Item(index);
+ outfile.GetLine(nIndex+1) = wxT("\text: ") + m_aExtensions.Item(index);
}
else
{
- outfile.InsertLine(wxT( "\text: ") + m_aExtensions.Item(index), nIndex + 1 );
+ outfile.InsertLine( wxT("\text: ") + m_aExtensions.Item(index), nIndex + 1 );
}
}
}
}
-void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename)
+void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
+ const wxArrayString& dirs)
{
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());
wxString sTmp(pc);
if (sTmp.Contains(wxT("=")) )
{
+ // GNOME 1:
if (sTmp.Contains( wxT("icon-filename=") ) )
{
curIconFile = sTmp.AfterFirst(wxT('='));
}
+ // GNOME 2:
+ 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;
+ }
+ }
+ }
else //: some other field,
{
//may contain lines like this (RH7)
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());
if ( nLine < nLineCount )
{
pc = textfile[nLine].c_str();
- if ( *pc == _T('#') )
+ if ( *pc == wxT('#') )
{
// skip comments
continue;
}
// what do we have here?
- if ( *pc == _T('\t') )
+ if ( *pc == wxT('\t') )
{
// this is a field=value ling
pc++; // skip leading TAB
static const int lenField = 4; // strlen("ext:")
- if ( wxStrncmp(pc, _T("ext:"), lenField) == 0 )
+ if ( wxStrncmp(pc, wxT("ext:"), lenField) == 0 )
{
// skip ' ' which follows and take everything left until the end
// of line
curMimeType.Empty();
- while ( *pc != _T(':') && *pc != _T('\0') )
+ while ( *pc != wxT(':') && *pc != wxT('\0') )
{
curMimeType += *pc++;
}
}
-void wxMimeTypesManagerImpl::LoadGnomeMimeFilesFromDir(const wxString& dirbase)
+void wxMimeTypesManagerImpl::LoadGnomeMimeFilesFromDir(
+ const wxString& dirbase, const wxArrayString& dirs)
{
wxASSERT_MSG( !!dirbase && !wxEndsWithPathSeparator(dirbase),
_T("base directory shouldn't end with a slash") );
wxString dirname = dirbase;
- dirname << _T("/mime-info");
+ dirname << wxT("/mime-info");
if ( !wxDir::Exists(dirname) )
return;
return;
// we will concatenate it with filename to get the full path below
- dirname += _T('/');
+ dirname += wxT('/');
wxString filename;
bool cont = dir.GetFirst(&filename, _T("*.mime"), wxDIR_FILES);
cont = dir.GetFirst(&filename, _T("*.keys"), wxDIR_FILES);
while ( cont )
{
- LoadGnomeDataFromKeyFile(dirname + filename);
+ LoadGnomeDataFromKeyFile(dirname + filename, dirs);
cont = dir.GetNext(&filename);
}
void wxMimeTypesManagerImpl::GetGnomeMimeInfo(const wxString& sExtraDir)
{
-
wxArrayString dirs;
- dirs.Add(_T("/usr/share"));
- dirs.Add(_T("/usr/local/share"));
+ dirs.Add(wxT("/usr/share"));
+ dirs.Add(wxT("/usr/local/share"));
wxString gnomedir;
wxGetHomeDir( &gnomedir );
- gnomedir += _T("/.gnome");
+ gnomedir += wxT("/.gnome");
dirs.Add( gnomedir );
if (!sExtraDir.empty()) dirs.Add( sExtraDir );
size_t nDirs = dirs.GetCount();
for ( size_t nDir = 0; nDir < nDirs; nDir++ )
{
- LoadGnomeMimeFilesFromDir(dirs[nDir]);
+ LoadGnomeMimeFilesFromDir(dirs[nDir], dirs);
}
}
wxMimeTextFile file;
if ( !file.Open(dirbase + filename) ) return;
+ wxLogTrace(TRACE_MIME, wxT("loading KDE file %s"),
+ (dirbase+filename).c_str());
+
wxMimeTypeCommands * entry = new wxMimeTypeCommands;
wxArrayString sExts;
wxString mimetype, mime_desc, strIcon;
- int nIndex = file.pIndexOf ("MimeType=");
+ int nIndex = file.pIndexOf( wxT("MimeType=") );
if (nIndex == wxNOT_FOUND)
{
// construct mimetype from the directory name and the basename of the
// file (it always has .kdelnk extension)
- mimetype << subdir << _T('/') << filename.BeforeLast(_T('.'));
+ mimetype << subdir << wxT('/') << filename.BeforeLast( wxT('.') );
}
else mimetype = file.GetCmd (nIndex);
if ( nIndex != wxNOT_FOUND )
{
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))
{
if (wxFileExists(icondirs[nDir] + strIcon))
{
strIcon.Prepend(icondirs[nDir]);
+ wxLogTrace(TRACE_MIME, wxT(" iconfile %s"), strIcon.c_str());
break;
}
}
if ( !dir.IsOpened() )
return;
+ wxLogTrace(TRACE_MIME, wxT("--- Loading from KDE directory %s ---"),
+ dirname.c_str());
+
dirname += _T('/');
wxString filename;
wxArrayString icondirs;
// settings in ~/.kde have maximal priority
- dirs.Add(wxGetHomeDir() + _T("/.kde/share"));
- icondirs.Add(wxGetHomeDir() + _T("/.kde/share/icons/"));
+ dirs.Add(wxGetHomeDir() + wxT("/.kde/share"));
+ icondirs.Add(wxGetHomeDir() + wxT("/.kde/share/icons/"));
// the variable KDEDIR is set when KDE is running
- const char *kdedir = getenv("KDEDIR");
+ const wxChar *kdedir = wxGetenv( wxT("KDEDIR") );
if ( kdedir )
{
- dirs.Add(wxString(kdedir) + _T("/share"));
- icondirs.Add(wxString(kdedir) + _T("/share/icons/"));
+ dirs.Add( wxString(kdedir) + wxT("/share") );
+ icondirs.Add( wxString(kdedir) + wxT("/share/icons/") );
}
else
{
m_aExtensions.Clear ();
m_aDescriptions.Clear ();
+ WX_CLEAR_ARRAY(m_aEntries);
m_aEntries.Empty();
m_mailcapStylesInited = 0;
wxMimeTypesManagerImpl::~wxMimeTypesManagerImpl()
{
ClearData();
-
- WX_CLEAR_ARRAY(m_aEntries);
}
entryOld->AddOrReplaceVerb(verb, entry->GetCmd(i));
}
}
+
+ // as we don't store it anywhere, it won't be deleted later as
+ // usual -- do it immediately instead
+ delete entry;
}
}
}
strFileName.c_str());
wxTextFile file(strFileName);
+#if defined(__WXGTK20__) && wxUSE_UNICODE
+ if ( !file.Open( wxConvUTF8) )
+#else
if ( !file.Open() )
+#endif
return FALSE;
// the information we extract
size_t nLineCount = file.GetLineCount();
const wxChar *pc = NULL;
- for ( size_t nLine = 0; nLine < nLineCount; nLine++ ) {
+ for ( size_t nLine = 0; nLine < nLineCount; nLine++ )
+ {
if ( pc == NULL ) {
// now we're at the start of the line
pc = file[nLine].c_str();
else if ( strLHS == wxT("exts") ) {
strExtensions = strRHS;
}
- else {
+ else if ( strLHS != _T("icon") )
+ {
// this one is simply ignored: it usually refers to Netscape
// built in icons which are useless for us anyhow
- if ( strLHS != _T("icon") )
- {
- wxLogWarning(_("Unknown field in file %s, line %d: '%s'."),
- strFileName.c_str(), nLine + 1, strLHS.c_str());
- }
+ }
+ else if ( !strLHS.StartsWith(_T("x-")) )
+ {
+ // we suppose that all fields starting with "X-" are
+ // unregistered extensions according to the standard practice,
+ // but it may be worth telling the user about other junk in
+ // his mime.types file
+ wxLogWarning(_("Unknown field in file %s, line %d: '%s'."),
+ strFileName.c_str(), nLine + 1, strLHS.c_str());
}
if ( !entryEnded ) {
strFileName.c_str());
wxTextFile file(strFileName);
+#if defined(__WXGTK20__) && wxUSE_UNICODE
+ if ( !file.Open( wxConvUTF8) )
+#else
if ( !file.Open() )
+#endif
return FALSE;
// indices of MIME types (in m_aTypes) we already found in this file
// something is wrong, bail out
cont = FALSE;
- wxLogDebug(wxT("Mailcap file %s, line %d: "
+ wxLogDebug(wxT("Mailcap file %s, line %lu: "
"'\\' on the end of the last line "
"ignored."),
strFileName.c_str(),
- nLine + 1);
+ (unsigned long)nLine + 1);
}
else
{
// this might be useful for the programmer
wxLogDebug
(
- wxT("Mailcap file %s, line %d: "
+ wxT("Mailcap file %s, line %lu: "
"unknown field '%s' for the "
"MIME type '%s' ignored."),
strFileName.c_str(),
- nLine + 1,
+ (unsigned long)nLine + 1,
curField.c_str(),
data.type.c_str()
);
if ( data.needsterminal )
{
- data.cmdOpen.Printf(_T("xterm -e sh -c '%s'"), data.cmdOpen.c_str());
+ data.cmdOpen = wxString::Format(_T("xterm -e sh -c '%s'"),
+ data.cmdOpen.c_str());
}
if ( !data.cmdOpen.empty() )