X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/83d8eb470b87ee0f19a203d2af3b70b153a87554..78e37b46a4c1581822bab8d99486bc35c0f360ea:/src/common/mimecmn.cpp diff --git a/src/common/mimecmn.cpp b/src/common/mimecmn.cpp index e6ca2e5f63..1121e348a7 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,28 +27,29 @@ #if wxUSE_MIMETYPE +#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" + #include "wx/crt.h" #endif //WX_PRECOMP -#include "wx/module.h" -#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 // implementation classes: #if defined(__WXMSW__) #include "wx/msw/mimetype.h" -#elif defined(__WXMAC__) - #include "wx/mac/mimetype.h" +#elif ( defined(__WXMAC__) && wxOSX_USE_CARBON ) + #include "wx/osx/mimetype.h" #elif defined(__WXPM__) || defined (__EMX__) #include "wx/os2/mimetype.h" #undef __UNIX__ @@ -66,34 +63,99 @@ // 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()); } +} + +void wxFileTypeInfo::VarArgInit(const wxString *mimeType, + const wxString *openCmd, + const wxString *printCmd, + const wxString *desc, + ...) +{ + va_list argptr; + va_start(argptr, desc); + + DoVarArgInit(*mimeType, *openCmd, *printCmd, *desc, argptr); va_end(argptr); } @@ -114,7 +176,7 @@ wxFileTypeInfo::wxFileTypeInfo(const wxArrayString& sArray) } #include "wx/arrimpl.cpp" -WX_DEFINE_OBJARRAY(wxArrayFileTypeInfo); +WX_DEFINE_OBJARRAY(wxArrayFileTypeInfo) // ============================================================================ // implementation of the wrapper classes @@ -412,12 +474,16 @@ bool wxFileType::Unassociate() #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; #endif @@ -437,12 +503,39 @@ bool wxFileType::SetDefaultIcon(const wxString& cmd, int index) #if defined (__WXMSW__) || defined(__UNIX__) return m_impl->SetDefaultIcon (cmd, index); #else + wxUnusedVar(index); wxFAIL_MSG(_T("not implemented")); - 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 @@ -451,7 +544,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, @@ -490,6 +583,8 @@ wxMimeTypesManager::~wxMimeTypesManager() bool wxMimeTypesManager::Unassociate(wxFileType *ft) { + EnsureImpl(); + #if defined(__UNIX__) && !defined(__CYGWIN__) && !defined(__WINE__) return m_impl->Unassociate(ft); #else @@ -506,6 +601,7 @@ wxMimeTypesManager::Associate(const wxFileTypeInfo& ftInfo) #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 @@ -515,7 +611,18 @@ wxFileType * wxMimeTypesManager::GetFileTypeFromExtension(const wxString& ext) { EnsureImpl(); - wxFileType *ft = m_impl->GetFileTypeFromExtension(ext); + + wxString::const_iterator i = ext.begin(); + const wxString::const_iterator end = ext.end(); + wxString extWithoutDot; + if ( i != end && *i == '.' ) + extWithoutDot.assign(++i, ext.end()); + else + extWithoutDot = ext; + + wxCHECK_MSG( !ext.empty(), NULL, _T("extension can't be empty") ); + + wxFileType *ft = m_impl->GetFileTypeFromExtension(extWithoutDot); if ( !ft ) { // check the fallbacks @@ -560,18 +667,6 @@ wxMimeTypesManager::GetFileTypeFromMimeType(const wxString& mimeType) return ft; } -bool wxMimeTypesManager::ReadMailcap(const wxString& filename, bool fallback) -{ - EnsureImpl(); - return m_impl->ReadMailcap(filename, fallback); -} - -bool wxMimeTypesManager::ReadMimeTypes(const wxString& filename) -{ - EnsureImpl(); - return m_impl->ReadMimeTypes(filename); -} - void wxMimeTypesManager::AddFallbacks(const wxFileTypeInfo *filetypes) { EnsureImpl(); @@ -634,10 +729,12 @@ class wxMimeTypeCmnModule: public wxModule { public: wxMimeTypeCmnModule() : wxModule() { } + 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;