X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f627fbee501c6dfad8a160d163a2987b1ac8ae42..dc7bf04dcf0da7699d48f8820544437b68b8f8e4:/src/common/mimecmn.cpp diff --git a/src/common/mimecmn.cpp b/src/common/mimecmn.cpp index bd85dc0a58..b24cc65838 100644 --- a/src/common/mimecmn.cpp +++ b/src/common/mimecmn.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: common/mimecmn.cpp +// Name: src/common/mimecmn.cpp // Purpose: classes and functions to manage MIME types // Author: Vadim Zeitlin // Modified by: @@ -18,10 +18,6 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "mimetypebase.h" -#endif - // for compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -31,25 +27,20 @@ #if wxUSE_MIMETYPE -#ifndef WX_PRECOMP - #include "wx/module.h" -#endif -// this one is needed for MSVC5 -#include "wx/module.h" +#include "wx/mimetype.h" #ifndef WX_PRECOMP - #include "wx/string.h" + #include "wx/dynarray.h" + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/module.h" #endif //WX_PRECOMP -#include "wx/log.h" #include "wx/file.h" #include "wx/iconloc.h" -#include "wx/intl.h" -#include "wx/dynarray.h" #include "wx/confbase.h" -#include "wx/mimetype.h" - // other standard headers #include @@ -58,8 +49,11 @@ #include "wx/msw/mimetype.h" #elif defined(__WXMAC__) #include "wx/mac/mimetype.h" -#elif defined(__WXPM__) +#elif defined(__WXPM__) || defined (__EMX__) #include "wx/os2/mimetype.h" + #undef __UNIX__ +#elif defined(__DOS__) + #include "wx/msdos/mimetype.h" #else // Unix #include "wx/unix/mimetype.h" #endif @@ -68,37 +62,127 @@ // common classes // ============================================================================ +// ---------------------------------------------------------------------------- +// wxMimeTypeCommands +// ---------------------------------------------------------------------------- + +void +wxMimeTypeCommands::AddOrReplaceVerb(const wxString& verb, const wxString& cmd) +{ + int n = m_verbs.Index(verb, false /* ignore case */); + if ( n == wxNOT_FOUND ) + { + m_verbs.Add(verb); + m_commands.Add(cmd); + } + else + { + m_commands[n] = cmd; + } +} + +wxString +wxMimeTypeCommands::GetCommandForVerb(const wxString& verb, size_t *idx) const +{ + wxString s; + + int n = m_verbs.Index(verb); + if ( n != wxNOT_FOUND ) + { + s = m_commands[(size_t)n]; + if ( idx ) + *idx = n; + } + else if ( idx ) + { + // different from any valid index + *idx = (size_t)-1; + } + + return s; +} + +wxString wxMimeTypeCommands::GetVerbCmd(size_t n) const +{ + return m_verbs[n] + wxT('=') + m_commands[n]; +} + // ---------------------------------------------------------------------------- // wxFileTypeInfo // ---------------------------------------------------------------------------- -wxFileTypeInfo::wxFileTypeInfo(const wxChar *mimeType, - const wxChar *openCmd, - const wxChar *printCmd, - const wxChar *desc, - ...) - : m_mimeType(mimeType), - m_openCmd(openCmd), - m_printCmd(printCmd), - m_desc(desc) +void wxFileTypeInfo::DoVarArgInit(const wxString& mimeType, + const wxString& openCmd, + const wxString& printCmd, + const wxString& desc, + va_list argptr) { - va_list argptr; - va_start(argptr, desc); + m_mimeType = mimeType; + m_openCmd = openCmd; + m_printCmd = printCmd; + m_desc = desc; for ( ;; ) { - const wxChar *ext = va_arg(argptr, const wxChar *); + // icc gives this warning in its own va_arg() macro, argh +#ifdef __INTELC__ + #pragma warning(push) + #pragma warning(disable: 1684) +#endif + + wxArgNormalizedString ext(WX_VA_ARG_STRING(argptr)); + +#ifdef __INTELC__ + #pragma warning(pop) +#endif if ( !ext ) { // NULL terminates the list break; } - m_exts.Add(ext); + m_exts.Add(ext.GetString()); } +} + +// NB: DoVarArgInit uses WX_VA_ARG_STRING macro to extract the string and this +// macro interprets the argument as char* or wchar_t* depending on build +// (and in UTF8 build, on the current locale). Because only one of the +// vararg forms below is called and the decision about which one gets +// called depends on the same conditions WX_VA_ARG_STRING uses, we can +// implement both of them in the exact same way: + +#if !wxUSE_UTF8_LOCALE_ONLY +void wxFileTypeInfo::VarArgInitWchar(const wxChar *mimeType, + const wxChar *openCmd, + const wxChar *printCmd, + const wxChar *desc, + ...) +{ + va_list argptr; + va_start(argptr, desc); + + DoVarArgInit(mimeType, openCmd, printCmd, desc, argptr); va_end(argptr); } +#endif // !wxUSE_UTF8_LOCALE_ONLY + +#if wxUSE_UNICODE_UTF8 +void wxFileTypeInfo::VarArgInitUtf8(const char *mimeType, + const char *openCmd, + const char *printCmd, + const char *desc, + ...) +{ + va_list argptr; + va_start(argptr, desc); + + DoVarArgInit(mimeType, openCmd, printCmd, desc, argptr); + + va_end(argptr); +} +#endif // wxUSE_UNICODE_UTF8 wxFileTypeInfo::wxFileTypeInfo(const wxArrayString& sArray) @@ -116,7 +200,7 @@ wxFileTypeInfo::wxFileTypeInfo(const wxArrayString& sArray) } #include "wx/arrimpl.cpp" -WX_DEFINE_OBJARRAY(wxArrayFileTypeInfo); +WX_DEFINE_OBJARRAY(wxArrayFileTypeInfo) // ============================================================================ // implementation of the wrapper classes @@ -130,7 +214,7 @@ WX_DEFINE_OBJARRAY(wxArrayFileTypeInfo); wxString wxFileType::ExpandCommand(const wxString& command, const wxFileType::MessageParameters& params) { - bool hasFilename = FALSE; + bool hasFilename = false; wxString str; for ( const wxChar *pc = command.c_str(); *pc != wxT('\0'); pc++ ) { @@ -148,7 +232,7 @@ wxString wxFileType::ExpandCommand(const wxString& command, str << wxT('"') << params.GetFileName() << wxT('"'); #endif str << params.GetFileName(); - hasFilename = TRUE; + hasFilename = true; break; case wxT('t'): @@ -200,7 +284,7 @@ wxString wxFileType::ExpandCommand(const wxString& command, // know of the correct solution, try to guess what we have to do. // test now carried out on reading file so test should never get here - if ( !hasFilename && !str.IsEmpty() + if ( !hasFilename && !str.empty() #ifdef __UNIX__ && !str.StartsWith(_T("test ")) #endif // Unix @@ -234,7 +318,7 @@ bool wxFileType::GetExtensions(wxArrayString& extensions) if ( m_info ) { extensions = m_info->GetExtensions(); - return TRUE; + return true; } return m_impl->GetExtensions(extensions); @@ -242,13 +326,13 @@ bool wxFileType::GetExtensions(wxArrayString& extensions) bool wxFileType::GetMimeType(wxString *mimeType) const { - wxCHECK_MSG( mimeType, FALSE, _T("invalid parameter in GetMimeType") ); + wxCHECK_MSG( mimeType, false, _T("invalid parameter in GetMimeType") ); if ( m_info ) { *mimeType = m_info->GetMimeType(); - return TRUE; + return true; } return m_impl->GetMimeType(mimeType); @@ -261,7 +345,7 @@ bool wxFileType::GetMimeTypes(wxArrayString& mimeTypes) const mimeTypes.Clear(); mimeTypes.Add(m_info->GetMimeType()); - return TRUE; + return true; } return m_impl->GetMimeTypes(mimeTypes); @@ -279,21 +363,40 @@ bool wxFileType::GetIcon(wxIconLocation *iconLoc) const #endif // __WXMSW__ } - return TRUE; + return true; } return m_impl->GetIcon(iconLoc); } +bool +wxFileType::GetIcon(wxIconLocation *iconloc, + const MessageParameters& params) const +{ + if ( !GetIcon(iconloc) ) + { + return false; + } + + // we may have "%s" in the icon location string, at least under Windows, so + // expand this + if ( iconloc ) + { + iconloc->SetFileName(ExpandCommand(iconloc->GetFileName(), params)); + } + + return true; +} + bool wxFileType::GetDescription(wxString *desc) const { - wxCHECK_MSG( desc, FALSE, _T("invalid parameter in GetDescription") ); + wxCHECK_MSG( desc, false, _T("invalid parameter in GetDescription") ); if ( m_info ) { *desc = m_info->GetDescription(); - return TRUE; + return true; } return m_impl->GetDescription(desc); @@ -303,13 +406,13 @@ bool wxFileType::GetOpenCommand(wxString *openCmd, const wxFileType::MessageParameters& params) const { - wxCHECK_MSG( openCmd, FALSE, _T("invalid parameter in GetOpenCommand") ); + wxCHECK_MSG( openCmd, false, _T("invalid parameter in GetOpenCommand") ); if ( m_info ) { *openCmd = ExpandCommand(m_info->GetOpenCommand(), params); - return TRUE; + return true; } return m_impl->GetOpenCommand(openCmd, params); @@ -331,13 +434,13 @@ bool wxFileType::GetPrintCommand(wxString *printCmd, const wxFileType::MessageParameters& params) const { - wxCHECK_MSG( printCmd, FALSE, _T("invalid parameter in GetPrintCommand") ); + wxCHECK_MSG( printCmd, false, _T("invalid parameter in GetPrintCommand") ); if ( m_info ) { *printCmd = ExpandCommand(m_info->GetPrintCommand(), params); - return TRUE; + return true; } return m_impl->GetPrintCommand(printCmd, params); @@ -387,22 +490,26 @@ bool wxFileType::Unassociate() { #if defined(__WXMSW__) return m_impl->Unassociate(); -#elif defined(__UNIX__) && !defined(__WXPM__) +#elif defined(__UNIX__) return m_impl->Unassociate(this); #else wxFAIL_MSG( _T("not implemented") ); // TODO - return FALSE; + return false; #endif } -bool wxFileType::SetCommand(const wxString& cmd, const wxString& verb, -bool overwriteprompt) +bool wxFileType::SetCommand(const wxString& cmd, + const wxString& verb, + bool overwriteprompt) { #if defined (__WXMSW__) || defined(__UNIX__) return m_impl->SetCommand(cmd, verb, overwriteprompt); #else + wxUnusedVar(cmd); + wxUnusedVar(verb); + wxUnusedVar(overwriteprompt); wxFAIL_MSG(_T("not implemented")); - return FALSE; + return false; #endif } @@ -413,19 +520,46 @@ bool wxFileType::SetDefaultIcon(const wxString& cmd, int index) // VZ: should we do this? // chris elliott : only makes sense in MS windows if ( sTmp.empty() ) - GetOpenCommand(&sTmp, wxFileType::MessageParameters(wxT(""), wxT(""))); + GetOpenCommand(&sTmp, wxFileType::MessageParameters(wxEmptyString, wxEmptyString)); #endif - wxCHECK_MSG( !sTmp.empty(), FALSE, _T("need the icon file") ); + wxCHECK_MSG( !sTmp.empty(), false, _T("need the icon file") ); #if defined (__WXMSW__) || defined(__UNIX__) return m_impl->SetDefaultIcon (cmd, index); #else + wxUnusedVar(index); wxFAIL_MSG(_T("not implemented")); - - return FALSE; + return false; #endif } +// ---------------------------------------------------------------------------- +// wxMimeTypesManagerFactory +// ---------------------------------------------------------------------------- + +wxMimeTypesManagerFactory *wxMimeTypesManagerFactory::m_factory = NULL; + +/* static */ +void wxMimeTypesManagerFactory::Set(wxMimeTypesManagerFactory *factory) +{ + delete m_factory; + + m_factory = factory; +} + +/* static */ +wxMimeTypesManagerFactory *wxMimeTypesManagerFactory::Get() +{ + if ( !m_factory ) + m_factory = new wxMimeTypesManagerFactory; + + return m_factory; +} + +wxMimeTypesManagerImpl *wxMimeTypesManagerFactory::CreateMimeTypesManagerImpl() +{ + return new wxMimeTypesManagerImpl; +} // ---------------------------------------------------------------------------- // wxMimeTypesManager @@ -434,7 +568,7 @@ bool wxFileType::SetDefaultIcon(const wxString& cmd, int index) void wxMimeTypesManager::EnsureImpl() { if ( !m_impl ) - m_impl = new wxMimeTypesManagerImpl; + m_impl = wxMimeTypesManagerFactory::Get()->CreateMimeTypesManagerImpl(); } bool wxMimeTypesManager::IsOfType(const wxString& mimeType, @@ -443,21 +577,21 @@ bool wxMimeTypesManager::IsOfType(const wxString& mimeType, wxASSERT_MSG( mimeType.Find(wxT('*')) == wxNOT_FOUND, wxT("first MIME type can't contain wildcards") ); - // all comparaisons are case insensitive (2nd arg of IsSameAs() is FALSE) + // all comparaisons are case insensitive (2nd arg of IsSameAs() is false) if ( wildcard.BeforeFirst(wxT('/')). - IsSameAs(mimeType.BeforeFirst(wxT('/')), FALSE) ) + IsSameAs(mimeType.BeforeFirst(wxT('/')), false) ) { wxString strSubtype = wildcard.AfterFirst(wxT('/')); if ( strSubtype == wxT("*") || - strSubtype.IsSameAs(mimeType.AfterFirst(wxT('/')), FALSE) ) + strSubtype.IsSameAs(mimeType.AfterFirst(wxT('/')), false) ) { // matches (either exactly or it's a wildcard) - return TRUE; + return true; } } - return FALSE; + return false; } wxMimeTypesManager::wxMimeTypesManager() @@ -473,7 +607,9 @@ wxMimeTypesManager::~wxMimeTypesManager() bool wxMimeTypesManager::Unassociate(wxFileType *ft) { -#if defined(__UNIX__) && !defined(__WXPM__) && !defined(__CYGWIN__) && !defined(__WINE__) + EnsureImpl(); + +#if defined(__UNIX__) && !defined(__CYGWIN__) && !defined(__WINE__) return m_impl->Unassociate(ft); #else return ft->Unassociate(); @@ -486,9 +622,10 @@ wxMimeTypesManager::Associate(const wxFileTypeInfo& ftInfo) { EnsureImpl(); -#if defined(__WXMSW__) || (defined(__UNIX__) && !defined(__WXPM__)) +#if defined(__WXMSW__) || defined(__UNIX__) return m_impl->Associate(ftInfo); #else // other platforms + wxUnusedVar(ftInfo); wxFAIL_MSG( _T("not implemented") ); // TODO return NULL; #endif // platforms @@ -583,20 +720,20 @@ size_t wxMimeTypesManager::EnumAllFileTypes(wxArrayString& mimetypes) void wxMimeTypesManager::Initialize(int mcapStyle, const wxString& sExtraDir) { -#if defined(__UNIX__) && !defined(__WXPM__) && !defined(__CYGWIN__) && !defined(__WINE__) +#if defined(__UNIX__) && !defined(__CYGWIN__) && !defined(__WINE__) EnsureImpl(); m_impl->Initialize(mcapStyle, sExtraDir); #else - (void)mcapStyle; - (void)sExtraDir; + (void)mcapStyle; + (void)sExtraDir; #endif // Unix } // and this function clears all the data from the manager void wxMimeTypesManager::ClearData() { -#if defined(__UNIX__) && !defined(__WXPM__) && !defined(__CYGWIN__) && !defined(__WINE__) +#if defined(__UNIX__) && !defined(__CYGWIN__) && !defined(__WINE__) EnsureImpl(); m_impl->ClearData(); @@ -617,10 +754,12 @@ class wxMimeTypeCmnModule: public wxModule { public: wxMimeTypeCmnModule() : wxModule() { } - virtual bool OnInit() { return TRUE; } + + virtual bool OnInit() { return true; } virtual void OnExit() { - // this avoids false memory leak allerts: + wxMimeTypesManagerFactory::Set(NULL); + if ( gs_mimeTypesManager.m_impl != NULL ) { delete gs_mimeTypesManager.m_impl;