X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1ee17e1c421b64b3a356fee82f454ab4b43ab50c..ac91b9d22aea519059b3f64adfba506d43aba639:/src/common/mimetype.cpp diff --git a/src/common/mimetype.cpp b/src/common/mimetype.cpp index 513c35b3fc..8e068c6f0f 100644 --- a/src/common/mimetype.cpp +++ b/src/common/mimetype.cpp @@ -170,7 +170,7 @@ public: // * compose and composetyped fields are used to determine the program to be // called to create a new message pert in the specified format (unused). // -// Parameter/filename xpansion: +// Parameter/filename xpansion: // * %s is replaced with the (full) file name // * %t is replaced with MIME type/subtype of the entry // * for multipart type only %n is replaced with the nnumber of parts and %F is @@ -189,7 +189,7 @@ public: // comments. Each record has one of two following forms: // a) for "brief" format: // -// b) for "expanded" format: +// b) for "expanded" format: // type= \ desc="" \ exts="ext" // // We try to autodetect the format of mime.types: if a non-comment line starts @@ -285,7 +285,7 @@ public: bool GetExtensions(wxArrayString& extensions); bool GetMimeType(wxString *mimeType) const { *mimeType = m_manager->m_aTypes[m_index]; return TRUE; } - bool GetIcon(wxIcon *icon) const + bool GetIcon(wxIcon * WXUNUSED(icon)) const { return FALSE; } // @@ maybe with Gnome/KDE integration... bool GetDescription(wxString *desc) const { *desc = m_manager->m_aDescriptions[m_index]; return TRUE; } @@ -337,8 +337,8 @@ wxString wxFileType::ExpandCommand(const wxString& command, case 's': // '%s' expands into file name (quoted because it might // contain spaces) - except if there are already quotes - // there because otherwise some programs may get confused by - // double double quotes + // there because otherwise some programs may get confused + // by double double quotes #if 0 if ( *(pc - 2) == '"' ) str << params.GetFileName(); @@ -448,6 +448,28 @@ wxFileType::GetPrintCommand(wxString *printCmd, // wxMimeTypesManager // ---------------------------------------------------------------------------- +bool wxMimeTypesManager::IsOfType(const wxString& mimeType, + const wxString& wildcard) +{ + wxASSERT_MSG( mimeType.Find('*') == wxNOT_FOUND, + "first MIME type can't contain wildcards" ); + + // all comparaisons are case insensitive (2nd arg of IsSameAs() is FALSE) + if ( wildcard.BeforeFirst('/').IsSameAs(mimeType.BeforeFirst('/'), FALSE) ) + { + wxString strSubtype = wildcard.AfterFirst('/'); + + if ( strSubtype == '*' || + strSubtype.IsSameAs(mimeType.AfterFirst('/'), FALSE) ) + { + // matches (either exactly or it's a wildcard) + return TRUE; + } + } + + return FALSE; +} + wxMimeTypesManager::wxMimeTypesManager() { m_impl = new wxMimeTypesManagerImpl; @@ -804,11 +826,11 @@ wxMimeTypesManagerImpl::GetFileTypeFromExtension(const wxString& ext) extensions = extensions.AfterFirst(' '); // consider extensions as not being case-sensitive - if ( field.IsSameAs(ext, FALSE /* no case */) ) { + if ( field.IsSameAs(ext, FALSE /* no case */) ) { // found wxFileType *fileType = new wxFileType; fileType->m_impl->Init(this, n); - + return fileType; } } @@ -971,6 +993,16 @@ void wxMimeTypesManagerImpl::ReadMimeTypes(const wxString& strFileName) } } + // although it doesn't seem to be covered by RFCs, some programs + // (notably Netscape) create their entries with several comma + // separated extensions (RFC mention the spaces only) + strExtensions.Replace(",", " "); + + // also deal with the leading dot + if ( !strExtensions.IsEmpty() && strExtensions[0] == '.' ) { + strExtensions.erase(0, 1); + } + int index = m_aTypes.Index(strMimeType); if ( index == wxNOT_FOUND ) { // add a new entry @@ -1031,8 +1063,8 @@ void wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName) } currentToken = Field_Type; // the flags and field values on the current line - bool needsterminal = false, - copiousoutput = false; + bool needsterminal = FALSE, + copiousoutput = FALSE; wxString strType, strOpenCmd, strPrintCmd, @@ -1094,8 +1126,8 @@ void wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName) // is this something of the form foo=bar? const char *pEq = strchr(curField, '='); if ( pEq != NULL ) { - wxString lhs = curField.Before('='), - rhs = curField.After('='); + wxString lhs = curField.BeforeFirst('='), + rhs = curField.AfterFirst('='); lhs.Trim(TRUE); // from right rhs.Trim(FALSE); // from left @@ -1143,12 +1175,14 @@ void wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName) { // don't flood the user with error messages // if we don't understand something in his - // mailcap + // mailcap, but give them in debug mode + // because this might be useful for the + // programmer wxLogDebug ( - _("Mailcap file %s, line %d: unknown " - "field '%s' for the MIME type " - "'%s' ignored."), + "Mailcap file %s, line %d: unknown " + "field '%s' for the MIME type " + "'%s' ignored.", strFileName.c_str(), nLine + 1, curField.c_str(),