-            wxString sTmp(pc);
-            int equal_pos = sTmp.Find( wxT('=') );
-            if (equal_pos > 0)
-            {
-                wxString left_of_equal = sTmp.Left( equal_pos );
-                const wxChar *right_of_equal = pc;
-                right_of_equal += equal_pos+1;
-
-                if (left_of_equal == wxT("icon_filename"))
-                {
-                    // GNOME 2:
-                    curIconFile = right_of_equal;
-
-                    wxFileName newFile( curIconFile );
-                    if (newFile.IsRelative() || newFile.FileExists())
-                    {
-                        size_t nDirs = search_dirs.GetCount();
-
-                        for (size_t nDir = 0; nDir < nDirs; nDir++)
-                        {
-                            newFile.SetPath( search_dirs[nDir] );
-                            newFile.AppendDir( wxT("pixmaps") );
-                            newFile.AppendDir( wxT("document-icons") );
-                            newFile.SetExt( wxT("png") );
-                            if (newFile.FileExists())
-                            {
-                                curIconFile = newFile.GetFullPath();
-                                // reorder search_dirs for speedup (fewer
-                                // calls to FileExist() required)
-                                if (nDir != 0)
-                                {
-                                    const wxString &tmp = search_dirs[nDir];
-                                    search_dirs.RemoveAt( nDir );
-                                    search_dirs.Insert( tmp, 0 );
-                                }
-                                break;
-                            }
-                        }
-                    }
-                }
-                else if (left_of_equal == wxT("open"))
-                {
-                    sTmp = right_of_equal;
-                    sTmp.Replace( wxT("%f"), wxT("%s") );
-                    sTmp.Prepend( wxT("open=") );
-                    entry->Add(sTmp);
-                }
-                else if (left_of_equal == wxT("view"))
-                {
-                    sTmp = right_of_equal;
-                    sTmp.Replace( wxT("%f"), wxT("%s") );
-                    sTmp.Prepend( wxT("view=") );
-                    entry->Add(sTmp);
-                }
-                else if (left_of_equal == wxT("print"))
-                {
-                    sTmp = right_of_equal;
-                    sTmp.Replace( wxT("%f"), wxT("%s") );
-                    sTmp.Prepend( wxT("print=") );
-                    entry->Add(sTmp);
-                }
-                else if (left_of_equal == wxT("description"))
-                {
-                    strDesc = right_of_equal;
-                }
-                else if (left_of_equal == wxT("short_list_application_ids_for_novice_user_level"))
-                {
-                    sTmp = right_of_equal;
-                    if (sTmp.Contains( wxT(",") ))
-                        sTmp = sTmp.BeforeFirst( wxT(',') );
-                    sTmp.Prepend( wxT("open=") );
-                    sTmp.Append( wxT(" %s") );
-                    entry->Add(sTmp);
-                }
-
-            } // emd of has an equals sign
-            else
-            {
-                // not a comment and not an equals sign
-                if (sTmp.Contains(wxT('/')))
-                {
-                    // this is the start of the new mimetype
-                    // overwrite any existing data
-                    if (! curMimeType.empty())
-                    {
-                        AddToMimeData( curMimeType, curIconFile, entry, strExtensions, strDesc );
-
-                        // now get ready for next bit
-                        entry = new wxMimeTypeCommands;
-                    }
-
-                    curMimeType = sTmp.BeforeFirst(wxT(':'));
-                }
-            }
-        } // end of not a comment
-
-        // ignore blank lines
-        nLine++;
-    } // end of while, save any data
-
-    if ( curMimeType.empty() )
-        delete entry;
-    else
-        AddToMimeData( curMimeType, curIconFile, entry, strExtensions, strDesc);
-}
-
-void wxMimeTypesManagerImpl::LoadGnomeMimeTypesFromMimeFile(const wxString& filename)
-{
-    wxMimeTextFile textfile(filename);
-    if ( !textfile.Open() )
-        return;
-
-    wxLogTrace(TRACE_MIME,
-               wxT("--- Opened Gnome file %s  ---"),
-               filename.c_str());
-
-    // values for the entry being parsed
-    wxString curMimeType, curExtList;
-
-    const wxChar *pc;
-    size_t nLineCount = textfile.GetLineCount();
-    for ( size_t nLine = 0; /* nothing */; nLine++ )
-    {
-        if ( nLine < nLineCount )
-        {
-            pc = textfile[nLine].c_str();
-            if ( *pc == wxT('#') )
-            {
-                // skip comments
-                continue;
-            }
-        }
-        else
-        {
-            // so that we will fall into the "if" below
-            pc = NULL;
-        }
-
-        if ( !pc || !*pc )
-        {
-            // end of the entry
-            if ( !curMimeType.empty() && !curExtList.empty() )
-            {
-                 wxLogTrace(TRACE_MIME,
-                            wxT("--- At end of Gnome file  finding mimetype %s  ---"),
-                            curMimeType.c_str());
-
-                 AddMimeTypeInfo(curMimeType, curExtList, wxEmptyString);
-            }
-
-            if ( !pc )
-            {
-                // the end: this can only happen if nLine == nLineCount
-                break;
-            }
-
-            curExtList.Empty();
-
-            continue;
-        }
-
-        // what do we have here?
-        if ( *pc == wxT('\t') )
-        {
-            // this is a field=value ling
-            pc++; // skip leading TAB
-
-            static const int lenField = 5; // strlen("ext: ")
-            if ( wxStrncmp(pc, wxT("ext: "), lenField) == 0 )
-            {
-                // 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());
-
-            if (! curMimeType.empty())
-                AddMimeTypeInfo(curMimeType, curExtList, wxEmptyString);
-
-            curMimeType.Empty();
-
-            while ( *pc != wxT(':') && *pc != wxT('\0') )
-            {
-                curMimeType += *pc++;
-            }
-        }
-    }
-}
-
-
-void wxMimeTypesManagerImpl::LoadGnomeMimeFilesFromDir(
-                      const wxString& dirbase, const wxArrayString& dirs)
-{
-    wxASSERT_MSG( !dirbase.empty() && !wxEndsWithPathSeparator(dirbase),
-                  wxT("base directory shouldn't end with a slash") );
-
-    wxString dirname = dirbase;
-    dirname << wxT("/mime-info");
-
-    if ( !wxDir::Exists(dirname) )
-        return;
-
-    wxDir dir(dirname);
-    if ( !dir.IsOpened() )
-        return;
-
-    // we will concatenate it with filename to get the full path below
-    dirname += wxT('/');
-
-    wxString filename;
-    bool cont;
-
-    cont = dir.GetFirst(&filename, wxT("*.mime"), wxDIR_FILES);
-    while ( cont )
-    {
-        LoadGnomeMimeTypesFromMimeFile(dirname + filename);
-
-        cont = dir.GetNext(&filename);
-    }
-
-    cont = dir.GetFirst(&filename, wxT("*.keys"), wxDIR_FILES);
-    while ( cont )
-    {
-        LoadGnomeDataFromKeyFile(dirname + filename, dirs);
-
-        cont = dir.GetNext(&filename);
-    }
-
-    // FIXME: 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) )
-    {
-        // Just 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"));
-
-    gnomedir = wxGetHomeDir();
-    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], dirs);
-    }
-}
-
-// ----------------------------------------------------------------------------
-// KDE
-// ----------------------------------------------------------------------------
-
-
-// KDE stores the icon info in its .kdelnk files. The file for mimetype/subtype
-// may be found in either of the following locations
-//
-//  1. $KDEDIR/share/mimelnk/mimetype/subtype.kdelnk
-//  2. ~/.kde/share/mimelnk/mimetype/subtype.kdelnk
-//
-// The format of a .kdelnk file is almost the same as the one used by
-// wxFileConfig, i.e. there are groups, comments and entries. The icon is the
-// value for the entry "Type"
-
-// 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 )
-{
-    if (sTest.empty())
-    {
-        return wxDir::Exists(sOK);
-    }
-    else
-    {
-        wxString sStart = sOK + wxT("/") + sTest.BeforeFirst(wxT('/'));
-        if (!wxDir::Exists(sStart))
-            wxMkdir(sStart);
-        wxString sEnd = sTest.AfterFirst(wxT('/'));
-        return CheckKDEDirsExist(sStart, sEnd);
-    }
-}
-
-bool wxMimeTypesManagerImpl::WriteKDEMimeFile(int index, bool delete_index)
-{
-    wxMimeTextFile appoutfile, mimeoutfile;
-    wxString sHome = wxGetHomeDir();
-    wxString sTmp = wxT(".kde/share/mimelnk/");
-    wxString sMime = m_aTypes[index];
-    CheckKDEDirsExist(sHome, sTmp + sMime.BeforeFirst(wxT('/')) );
-    sTmp = sHome + wxT('/') + sTmp + sMime + wxT(".kdelnk");
-
-    bool bTemp;
-    bool bMimeExists = mimeoutfile.Open(sTmp);
-    if (!bMimeExists)
-    {
-        bTemp = mimeoutfile.Create(sTmp);
-        // some unknown error eg out of disk space
-        if (!bTemp)
-            return false;
-    }
-
-    sTmp = wxT(".kde/share/applnk/");
-    CheckKDEDirsExist(sHome, sTmp + sMime.AfterFirst(wxT('/')) );
-    sTmp = sHome + wxT('/') + sTmp + sMime.AfterFirst(wxT('/')) + wxT(".kdelnk");
-
-    bool bAppExists;
-    bAppExists = appoutfile.Open(sTmp);
-    if (!bAppExists)
-    {
-        bTemp = appoutfile.Create(sTmp);
-        // some unknown error eg out of disk space
-        if (!bTemp)
-            return false;
-    }
-
-    // fixed data; write if new file
-    if (!bMimeExists)
-    {
-        mimeoutfile.AddLine(wxT("#KDE Config File"));
-        mimeoutfile.AddLine(wxT("[KDE Desktop Entry]"));
-        mimeoutfile.AddLine(wxT("Version=1.0"));
-        mimeoutfile.AddLine(wxT("Type=MimeType"));
-        mimeoutfile.AddLine(wxT("MimeType=") + sMime);
-    }
-
-    if (!bAppExists)
-    {
-        mimeoutfile.AddLine(wxT("#KDE Config File"));
-        mimeoutfile.AddLine(wxT("[KDE Desktop Entry]"));
-        appoutfile.AddLine(wxT("Version=1.0"));
-        appoutfile.AddLine(wxT("Type=Application"));
-        appoutfile.AddLine(wxT("MimeType=") + sMime + wxT(';'));
-    }
-
-    // variable data
-    // ignore locale
-    mimeoutfile.CommentLine(wxT("Comment="));
-    if (!delete_index)
-        mimeoutfile.AddLine(wxT("Comment=") + m_aDescriptions[index]);
-    appoutfile.CommentLine(wxT("Name="));
-    if (!delete_index)
-        appoutfile.AddLine(wxT("Comment=") + m_aDescriptions[index]);
-
-    sTmp = m_aIcons[index];
-    // we can either give the full path, or the shortfilename if its in
-    // one of the directories we search
-    mimeoutfile.CommentLine(wxT("Icon=") );
-    if (!delete_index)
-        mimeoutfile.AddLine(wxT("Icon=") + sTmp );
-    appoutfile.CommentLine(wxT("Icon=") );
-    if (!delete_index)
-        appoutfile.AddLine(wxT("Icon=") + sTmp );
-
-    sTmp = wxT(" ") + m_aExtensions[index];
-
-    wxStringTokenizer tokenizer(sTmp, wxT(" "));
-    sTmp = wxT("Patterns=");
-    mimeoutfile.CommentLine(sTmp);
-    while ( tokenizer.HasMoreTokens() )
-    {
-        // holds an extension; need to change it to *.ext;
-        wxString e = wxT("*.") + tokenizer.GetNextToken() + wxT(";");
-        sTmp += e;
-    }
-
-    if (!delete_index)
-        mimeoutfile.AddLine(sTmp);
-
-    wxMimeTypeCommands * entries = m_aEntries[index];
-    // if we don't find open just have an empty string ... FIX this
-    sTmp = entries->GetCommandForVerb(wxT("open"));
-    sTmp.Replace( wxT("%s"), wxT("%f") );
-
-    mimeoutfile.CommentLine(wxT("DefaultApp=") );
-    if (!delete_index)
-        mimeoutfile.AddLine(wxT("DefaultApp=") + sTmp);
-
-    sTmp.Replace( wxT("%f"), wxT("") );
-    appoutfile.CommentLine(wxT("Exec="));
-    if (!delete_index)
-        appoutfile.AddLine(wxT("Exec=") + sTmp);
-
-    if (entries->GetCount() > 1)
-    {
-        //other actions as well as open
-    }
-
-    bTemp = false;
-    if (mimeoutfile.Write())
-        bTemp = true;
-    mimeoutfile.Close();
-    if (appoutfile.Write())
-        bTemp = true;
-    appoutfile.Close();
-
-    return bTemp;
-}
-
-void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase,
-                                               const wxString& subdir,
-                                               const wxString& filename,
-                                               const wxArrayString& icondirs)
-{
-    wxFileName fullname(dirbase, filename);
-    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;
-
-    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 << wxT('/') << filename.BeforeLast( wxT('.') );
-    }
-    else
-        mimetype = file.GetCmd(nIndex);
-
-    // first find the description string: it is the value in either "Comment="
-    // line or "Comment[<locale_name>]=" one
-    nIndex = wxNOT_FOUND;
-
-    wxString comment;
-
-#if wxUSE_INTL
-    wxLocale *locale = wxGetLocale();
-    if ( locale )
-    {
-        // try "Comment[locale name]" first
-        comment << wxT("Comment[") + locale->GetName() + wxT("]=");
-        nIndex = file.pIndexOf(comment);
-    }
-#endif
-
-    if ( nIndex == wxNOT_FOUND )
-    {
-        comment = wxT("Comment=");
-        nIndex = file.pIndexOf(comment);
-    }
-
-    if ( nIndex != wxNOT_FOUND )
-        mime_desc = file.GetCmd(nIndex);
-    //else: no description
-
-    // next find the extensions
-    wxString mime_extension;
-
-    nIndex = file.pIndexOf(wxT("Patterns="));
-    if ( nIndex != wxNOT_FOUND )
-    {
-        wxString exts = file.GetCmd(nIndex);
-
-        wxStringTokenizer tokenizer(exts, wxT(";"));
-        while ( tokenizer.HasMoreTokens() )
-        {
-            wxString e = tokenizer.GetNextToken();
-
-            // don't support too difficult patterns
-            if ( e.Left(2) != wxT("*.") )
-                continue;
-
-            if ( !mime_extension.empty() )
-            {
-                // separate from the previous ext
-                mime_extension << wxT(' ');
-            }
-
-            mime_extension << e.Mid(2);
-        }
-    }
-
-    sExts.Add(mime_extension);
-
-    // ok, now we can take care of icon:
-
-    nIndex = file.pIndexOf(wxT("Icon="));
-    if ( nIndex != wxNOT_FOUND )