X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad9835c97c10c0d7de345e3a7a7c0fc2776eb2cb..8bd37efca7eb0de7cdf72167e138f9cabd9b6750:/src/common/mimecmn.cpp diff --git a/src/common/mimecmn.cpp b/src/common/mimecmn.cpp index 326eefa0af..b24cc65838 100644 --- a/src/common/mimecmn.cpp +++ b/src/common/mimecmn.cpp @@ -27,20 +27,20 @@ #if wxUSE_MIMETYPE +#include "wx/mimetype.h" + #ifndef WX_PRECOMP #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/module.h" -#include "wx/log.h" #include "wx/file.h" #include "wx/iconloc.h" -#include "wx/intl.h" #include "wx/confbase.h" -#include "wx/mimetype.h" - // other standard headers #include @@ -62,22 +62,65 @@ // 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 ( ;; ) { @@ -87,7 +130,7 @@ wxFileTypeInfo::wxFileTypeInfo(const wxChar *mimeType, #pragma warning(disable: 1684) #endif - const wxChar *ext = va_arg(argptr, const wxChar *); + wxArgNormalizedString ext(WX_VA_ARG_STRING(argptr)); #ifdef __INTELC__ #pragma warning(pop) @@ -98,11 +141,48 @@ wxFileTypeInfo::wxFileTypeInfo(const wxChar *mimeType, 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) @@ -453,28 +533,27 @@ bool wxFileType::SetDefaultIcon(const wxString& cmd, int index) #endif } -//---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- // wxMimeTypesManagerFactory -//---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- wxMimeTypesManagerFactory *wxMimeTypesManagerFactory::m_factory = NULL; /* static */ -void wxMimeTypesManagerFactory::SetFactory( wxMimeTypesManagerFactory *factory ) +void wxMimeTypesManagerFactory::Set(wxMimeTypesManagerFactory *factory) { - if (wxMimeTypesManagerFactory::m_factory) - delete wxMimeTypesManagerFactory::m_factory; + delete m_factory; - wxMimeTypesManagerFactory::m_factory = factory; + m_factory = factory; } /* static */ -wxMimeTypesManagerFactory *wxMimeTypesManagerFactory::GetFactory() +wxMimeTypesManagerFactory *wxMimeTypesManagerFactory::Get() { - if (!wxMimeTypesManagerFactory::m_factory) - wxMimeTypesManagerFactory::m_factory = new wxMimeTypesManagerFactory; + if ( !m_factory ) + m_factory = new wxMimeTypesManagerFactory; - return wxMimeTypesManagerFactory::m_factory; + return m_factory; } wxMimeTypesManagerImpl *wxMimeTypesManagerFactory::CreateMimeTypesManagerImpl() @@ -489,7 +568,7 @@ wxMimeTypesManagerImpl *wxMimeTypesManagerFactory::CreateMimeTypesManagerImpl() void wxMimeTypesManager::EnsureImpl() { if ( !m_impl ) - m_impl = wxMimeTypesManagerFactory::GetFactory()->CreateMimeTypesManagerImpl(); + m_impl = wxMimeTypesManagerFactory::Get()->CreateMimeTypesManagerImpl(); } bool wxMimeTypesManager::IsOfType(const wxString& mimeType, @@ -528,6 +607,8 @@ wxMimeTypesManager::~wxMimeTypesManager() bool wxMimeTypesManager::Unassociate(wxFileType *ft) { + EnsureImpl(); + #if defined(__UNIX__) && !defined(__CYGWIN__) && !defined(__WINE__) return m_impl->Unassociate(ft); #else @@ -673,10 +754,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;