]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/mimetype.cpp
speeding up rectangle drawing by using specific methods, needs 40% less time
[wxWidgets.git] / src / unix / mimetype.cpp
index dd76cf2a6a0f9df934cdd0e56ac75a36c666379b..caa9459875e990a4b8bfa67a1fb482553792b521 100644 (file)
 class wxMimeTextFile
 {
 public:
 class wxMimeTextFile
 {
 public:
-    wxMimeTextFile() 
+    wxMimeTextFile()
     {
     }
     {
     }
-    
+
     wxMimeTextFile(const wxString& fname)
     {
        m_fname = fname;
     }
     wxMimeTextFile(const wxString& fname)
     {
        m_fname = fname;
     }
-    
+
     bool Open()
     {
        wxFFile file( m_fname );
        if (!file.IsOpened())
           return false;
     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 );
        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 );
        // Check for valid UTF-8 here?
        wxString all = wxString::FromUTF8( buffer, size );
-       
+
        wxStringTokenizer tok( all, "\n" );
        while (tok.HasMoreTokens())
        {
        wxStringTokenizer tok( all, "\n" );
        while (tok.HasMoreTokens())
        {
@@ -77,7 +77,7 @@ public:
        }
        return true;
     }
        }
        return true;
     }
-    
+
     unsigned int GetLineCount() const { return m_text.GetCount(); }
     wxString &GetLine( unsigned int line ) { return m_text[line]; }
 
     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;
     }
         wxString sTmp = GetLine(i).AfterFirst(wxT('='));
         return sTmp;
     }
-    
+
 private:
     wxArrayString m_text;
     wxString m_fname;
 private:
     wxArrayString m_text;
     wxString m_fname;
@@ -138,7 +138,7 @@ void wxMimeTypesManagerImpl::LoadXDGApp(const wxString& filename)
     wxMimeTextFile file(filename);
     if ( !file.Open() )
         return;
     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")
     // Here, only type 'Application' should be considered.
     int nIndex = file.pIndexOf( "Type=" );
     if (nIndex != wxNOT_FOUND && file.GetCmd(nIndex) != "application")
@@ -161,7 +161,7 @@ void wxMimeTypesManagerImpl::LoadXDGApp(const wxString& filename)
 #if wxUSE_INTL // try "Name[locale name]" first
     wxLocale *locale = wxGetLocale();
     if ( locale )
 #if wxUSE_INTL // try "Name[locale name]" first
     wxLocale *locale = wxGetLocale();
     if ( locale )
-        nIndex = file.pIndexOf(_T("Name[")+locale->GetName()+_T("]="));
+        nIndex = file.pIndexOf(wxT("Name[")+locale->GetName()+wxT("]="));
 #endif // wxUSE_INTL
     if(nIndex == wxNOT_FOUND)
         nIndex = file.pIndexOf( wxT("Name=") );
 #endif // wxUSE_INTL
     if(nIndex == wxNOT_FOUND)
         nIndex = file.pIndexOf( wxT("Name=") );
@@ -173,7 +173,7 @@ void wxMimeTypesManagerImpl::LoadXDGApp(const wxString& filename)
     nIndex = wxNOT_FOUND;
 #if wxUSE_INTL // try "Icon[locale name]" first
     if ( locale )
     nIndex = wxNOT_FOUND;
 #if wxUSE_INTL // try "Icon[locale name]" first
     if ( locale )
-        nIndex = file.pIndexOf(_T("Icon[")+locale->GetName()+_T("]="));
+        nIndex = file.pIndexOf(wxT("Icon[")+locale->GetName()+wxT("]="));
 #endif // wxUSE_INTL
     if(nIndex == wxNOT_FOUND)
         nIndex = file.pIndexOf( wxT("Icon=") );
 #endif // wxUSE_INTL
     if(nIndex == wxNOT_FOUND)
         nIndex = file.pIndexOf( wxT("Icon=") );
@@ -198,7 +198,7 @@ void wxMimeTypesManagerImpl::LoadXDGApp(const wxString& filename)
     sCmd.Replace(wxT("%i"), nameicon);
     sCmd.Replace(wxT("%m"), namemini);
 
     sCmd.Replace(wxT("%i"), nameicon);
     sCmd.Replace(wxT("%m"), namemini);
 
-    wxStringTokenizer tokenizer(mimetypes, _T(";"));
+    wxStringTokenizer tokenizer(mimetypes, wxT(";"));
     while(tokenizer.HasMoreTokens()) {
         wxString mimetype = tokenizer.GetNextToken().Lower();
         nIndex = m_aTypes.Index(mimetype);
     while(tokenizer.HasMoreTokens()) {
         wxString mimetype = tokenizer.GetNextToken().Lower();
         nIndex = m_aTypes.Index(mimetype);
@@ -222,7 +222,7 @@ void wxMimeTypesManagerImpl::LoadXDGAppsFilesFromDir(const wxString& dirname)
 
     wxString filename;
     // Look into .desktop files
 
     wxString filename;
     // Look into .desktop files
-    bool cont = dir.GetFirst(&filename, _T("*.desktop"), wxDIR_FILES);
+    bool cont = dir.GetFirst(&filename, wxT("*.desktop"), wxDIR_FILES);
     while (cont)
     {
         wxFileName p(dirname, filename);
     while (cont)
     {
         wxFileName p(dirname, filename);
@@ -230,10 +230,10 @@ void wxMimeTypesManagerImpl::LoadXDGAppsFilesFromDir(const wxString& dirname)
         cont = dir.GetNext(&filename);
     }
 
         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
     // 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)
     // 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)
 {
 
 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;
 
     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,15 +506,20 @@ void wxMimeTypesManagerImpl::InitIfNeeded()
     {
         // set the flag first to prevent recursion
         m_initialized = true;
     {
         // 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"))
-            Initialize( wxMAILCAP_GNOME );
-        else
-            Initialize();
+
+        int mailcapStyles = wxMAILCAP_ALL;
+        if ( wxAppTraits * const traits = wxApp::GetTraitsIfExists() )
+        {
+            wxString wm = traits->GetDesktopEnvironment();
+
+            if ( wm == "KDE" )
+                mailcapStyles = wxMAILCAP_KDE;
+            else if ( wm == "GNOME" )
+                mailcapStyles = wxMAILCAP_GNOME;
+            //else: unknown, use the default
+        }
+
+        Initialize(mailcapStyles);
     }
 }
 
     }
 }
 
@@ -513,10 +532,11 @@ void wxMimeTypesManagerImpl::Initialize(int mailcapStyles,
 #ifdef __VMS
     // XDG tables are never installed on OpenVMS
     return;
 #ifdef __VMS
     // XDG tables are never installed on OpenVMS
     return;
-#endif
+#else
 
     // Read MIME type - extension associations
     LoadXDGGlobs( "/usr/share/mime/globs" );
 
     // 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
 
     // 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 +560,7 @@ void wxMimeTypesManagerImpl::Initialize(int mailcapStyles,
            xdgDataDirs += ':';
            xdgDataDirs += sExtraDir;
         }
            xdgDataDirs += ':';
            xdgDataDirs += sExtraDir;
         }
-        
+
         wxArrayString dirs;
         wxStringTokenizer tokenizer(xdgDataDirs, ":");
         while ( tokenizer.HasMoreTokens() )
         wxArrayString dirs;
         wxStringTokenizer tokenizer(xdgDataDirs, ":");
         while ( tokenizer.HasMoreTokens() )
@@ -588,9 +608,8 @@ void wxMimeTypesManagerImpl::Initialize(int mailcapStyles,
                     {
                         if (textfile.GetLine(i).Find(wxT("=")) != wxNOT_FOUND)
                         {
                     {
                         if (textfile.GetLine(i).Find(wxT("=")) != wxNOT_FOUND)
                         {
-                            wxString mimeType = textfile.GetVerb(i);
                             wxString desktopFile = textfile.GetCmd(i);
                             wxString desktopFile = textfile.GetCmd(i);
-                            
+
                             if (deskTopFilesSeen.Index(desktopFile) == wxNOT_FOUND)
                             {
                                 deskTopFilesSeen.Add(desktopFile);
                             if (deskTopFilesSeen.Index(desktopFile) == wxNOT_FOUND)
                             {
                                 deskTopFilesSeen.Add(desktopFile);
@@ -601,7 +620,7 @@ void wxMimeTypesManagerImpl::Initialize(int mailcapStyles,
                                     if (desktopPath.Last() != '/') desktopPath += '/';
                                     desktopPath += "applications/";
                                     desktopPath += desktopFile;
                                     if (desktopPath.Last() != '/') desktopPath += '/';
                                     desktopPath += "applications/";
                                     desktopPath += desktopFile;
-                                    
+
                                     if (wxFileExists(desktopPath))
                                         LoadXDGApp(desktopPath);
                                 }
                                     if (wxFileExists(desktopPath))
                                         LoadXDGApp(desktopPath);
                                 }
@@ -612,6 +631,7 @@ void wxMimeTypesManagerImpl::Initialize(int mailcapStyles,
             }
         }
     }
             }
         }
     }
+#endif
 }
 
 // clear data so you can read another group of WM files
 }
 
 // clear data so you can read another group of WM files
@@ -703,16 +723,35 @@ int wxMimeTypesManagerImpl::AddToMimeData(const wxString& strType,
     int nIndex = m_aTypes.Index(mimeType);
     if ( nIndex == wxNOT_FOUND )
     {
     int nIndex = m_aTypes.Index(mimeType);
     if ( nIndex == wxNOT_FOUND )
     {
-        // new file type
-        m_aTypes.Add(mimeType);
-        m_aIcons.Add(strIcon);
-        m_aEntries.Add(entry ? entry : new wxMimeTypeCommands);
+        // We put MIME types containing  "application" at the end, so that
+        // if the MIME type for the extention "htm" is searched for, it will
+        // rather find "text/html" than "application/x-mozilla-bookmarks".
+        if (mimeType.Find( "application" ) == 0)
+        {
+           // new file type
+           m_aTypes.Add(mimeType);
+           m_aIcons.Add(strIcon);
+           m_aEntries.Add(entry ? entry : new wxMimeTypeCommands);
+
+           // change nIndex so we can use it below to add the extensions
+           m_aExtensions.Add(wxEmptyString);
+           nIndex = m_aExtensions.size() - 1;
+
+           m_aDescriptions.Add(strDesc);
+        }
+        else
+        {
+           // new file type
+           m_aTypes.Insert(mimeType,0);
+           m_aIcons.Insert(strIcon,0);
+           m_aEntries.Insert(entry ? entry : new wxMimeTypeCommands,0);
 
 
-        // change nIndex so we can use it below to add the extensions
-        m_aExtensions.Add(wxEmptyString);
-        nIndex = m_aExtensions.size() - 1;
+           // change nIndex so we can use it below to add the extensions
+           m_aExtensions.Insert(wxEmptyString,0);
+           nIndex = 0;
 
 
-        m_aDescriptions.Add(strDesc);
+           m_aDescriptions.Insert(strDesc,0);
+        }
     }
     else // yes, we already have it
     {
     }
     else // yes, we already have it
     {
@@ -830,7 +869,7 @@ wxFileType * wxMimeTypesManagerImpl::GetFileTypeFromMimeType(const wxString& mim
 
     // first look for an exact match
     int index = m_aTypes.Index(mimetype);
 
     // first look for an exact match
     int index = m_aTypes.Index(mimetype);
-    
+
     if ( index != wxNOT_FOUND )
     {
         fileType = new wxFileType;
     if ( index != wxNOT_FOUND )
     {
         fileType = new wxFileType;