X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5fde6fcc9b551340a194ae4c726db5ab64b5c594..d10e22fe8ad283f37b1809349028ffc282e393ce:/src/common/mimecmn.cpp diff --git a/src/common/mimecmn.cpp b/src/common/mimecmn.cpp index 7ee3ef0dff..db1cf082f3 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: @@ -7,7 +7,7 @@ // Created: 23.09.98 // RCS-ID: $Id$ // Copyright: (c) 1998 Vadim Zeitlin -// Licence: wxWindows license (part of wxExtra library) +// Licence: wxWindows licence (part of wxExtra library) ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -18,37 +18,29 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "mimetypebase.h" -#endif - // for compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include "wx/module.h" #ifdef __BORLANDC__ - #pragma hdrstop + #pragma hdrstop #endif -#ifndef WX_PRECOMP - #include "wx/defs.h" -#endif +#if wxUSE_MIMETYPE + +#include "wx/mimetype.h" #ifndef WX_PRECOMP - #include "wx/string.h" - #if wxUSE_GUI - #include "wx/icon.h" - #endif + #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/intl.h" -#include "wx/dynarray.h" +#include "wx/iconloc.h" #include "wx/confbase.h" -#include "wx/mimetype.h" - // other standard headers #include @@ -57,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 @@ -71,10 +66,10 @@ // wxFileTypeInfo // ---------------------------------------------------------------------------- -wxFileTypeInfo::wxFileTypeInfo(const char *mimeType, - const char *openCmd, - const char *printCmd, - const char *desc, +wxFileTypeInfo::wxFileTypeInfo(const wxChar *mimeType, + const wxChar *openCmd, + const wxChar *printCmd, + const wxChar *desc, ...) : m_mimeType(mimeType), m_openCmd(openCmd), @@ -86,7 +81,17 @@ wxFileTypeInfo::wxFileTypeInfo(const char *mimeType, for ( ;; ) { - const char *ext = va_arg(argptr, const char *); + // icc gives this warning in its own va_arg() macro, argh +#ifdef __INTELC__ + #pragma warning(push) + #pragma warning(disable: 1684) +#endif + + const wxChar *ext = va_arg(argptr, const wxChar *); + +#ifdef __INTELC__ + #pragma warning(pop) +#endif if ( !ext ) { // NULL terminates the list @@ -99,8 +104,23 @@ wxFileTypeInfo::wxFileTypeInfo(const char *mimeType, va_end(argptr); } + +wxFileTypeInfo::wxFileTypeInfo(const wxArrayString& sArray) +{ + m_mimeType = sArray [0u]; + m_openCmd = sArray [1u]; + m_printCmd = sArray [2u]; + m_desc = sArray [3u]; + + size_t count = sArray.GetCount(); + for ( size_t i = 4; i < count; i++ ) + { + m_exts.Add(sArray[i]); + } +} + #include "wx/arrimpl.cpp" -WX_DEFINE_OBJARRAY(wxArrayFileTypeInfo); +WX_DEFINE_OBJARRAY(wxArrayFileTypeInfo) // ============================================================================ // implementation of the wrapper classes @@ -114,7 +134,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++ ) { @@ -132,7 +152,7 @@ wxString wxFileType::ExpandCommand(const wxString& command, str << wxT('"') << params.GetFileName() << wxT('"'); #endif str << params.GetFileName(); - hasFilename = TRUE; + hasFilename = true; break; case wxT('t'): @@ -182,7 +202,9 @@ wxString wxFileType::ExpandCommand(const wxString& command, // behave like this, in particular a common test is 'test -n "$DISPLAY"' // and appending "< %s" to this command makes the test fail... I don't // know of the correct solution, try to guess what we have to do. - if ( !hasFilename && !str.IsEmpty() + + // test now carried out on reading file so test should never get here + if ( !hasFilename && !str.empty() #ifdef __UNIX__ && !str.StartsWith(_T("test ")) #endif // Unix @@ -216,7 +238,7 @@ bool wxFileType::GetExtensions(wxArrayString& extensions) if ( m_info ) { extensions = m_info->GetExtensions(); - return TRUE; + return true; } return m_impl->GetExtensions(extensions); @@ -224,13 +246,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); @@ -243,50 +265,58 @@ bool wxFileType::GetMimeTypes(wxArrayString& mimeTypes) const mimeTypes.Clear(); mimeTypes.Add(m_info->GetMimeType()); - return TRUE; + return true; } return m_impl->GetMimeTypes(mimeTypes); } -bool wxFileType::GetIcon(wxIcon *icon, - wxString *iconFile, - int *iconIndex) const +bool wxFileType::GetIcon(wxIconLocation *iconLoc) const { if ( m_info ) { - if ( iconFile ) - *iconFile = m_info->GetIconFile(); - if ( iconIndex ) - *iconIndex = m_info->GetIconIndex(); - -#if wxUSE_GUI - if ( icon && !m_info->GetIconFile().empty() ) + if ( iconLoc ) { - // FIXME: what about the index? - icon->LoadFile(m_info->GetIconFile()); + iconLoc->SetFileName(m_info->GetIconFile()); +#ifdef __WXMSW__ + iconLoc->SetIndex(m_info->GetIconIndex()); +#endif // __WXMSW__ } -#endif // wxUSE_GUI - return TRUE; + return true; } -#ifdef __WXMSW__ - return m_impl->GetIcon(icon, iconFile, iconIndex); -#else - return m_impl->GetIcon(icon); -#endif + 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); @@ -296,29 +326,41 @@ 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); } +wxString wxFileType::GetOpenCommand(const wxString& filename) const +{ + wxString cmd; + if ( !GetOpenCommand(&cmd, filename) ) + { + // return empty string to indicate an error + cmd.clear(); + } + + return cmd; +} + 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); @@ -334,9 +376,9 @@ size_t wxFileType::GetAllCommands(wxArrayString *verbs, if ( commands ) commands->Clear(); -#ifdef __WXMSW__ +#if defined (__WXMSW__) || defined(__UNIX__) return m_impl->GetAllCommands(verbs, commands, params); -#else // !__WXMSW__ +#else // !__WXMSW__ || Unix // we don't know how to retrieve all commands, so just try the 2 we know // about size_t count = 0; @@ -361,19 +403,84 @@ size_t wxFileType::GetAllCommands(wxArrayString *verbs, } return count; -#endif // __WXMSW__/!__WXMSW__ +#endif // __WXMSW__/| __UNIX__ } bool wxFileType::Unassociate() { -#if defined(__WXMSW__) || defined(__UNIX__) +#if defined(__WXMSW__) return m_impl->Unassociate(); +#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) +{ +#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 } +bool wxFileType::SetDefaultIcon(const wxString& cmd, int index) +{ + wxString sTmp = cmd; +#ifdef __WXMSW__ + // VZ: should we do this? + // chris elliott : only makes sense in MS windows + if ( sTmp.empty() ) + GetOpenCommand(&sTmp, wxFileType::MessageParameters(wxEmptyString, wxEmptyString)); +#endif + 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; +#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 // ---------------------------------------------------------------------------- @@ -381,7 +488,7 @@ bool wxFileType::Unassociate() void wxMimeTypesManager::EnsureImpl() { if ( !m_impl ) - m_impl = new wxMimeTypesManagerImpl; + m_impl = wxMimeTypesManagerFactory::Get()->CreateMimeTypesManagerImpl(); } bool wxMimeTypesManager::IsOfType(const wxString& mimeType, @@ -390,21 +497,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() @@ -418,6 +525,18 @@ wxMimeTypesManager::~wxMimeTypesManager() delete m_impl; } +bool wxMimeTypesManager::Unassociate(wxFileType *ft) +{ + EnsureImpl(); + +#if defined(__UNIX__) && !defined(__CYGWIN__) && !defined(__WINE__) + return m_impl->Unassociate(ft); +#else + return ft->Unassociate(); +#endif +} + + wxFileType * wxMimeTypesManager::Associate(const wxFileTypeInfo& ftInfo) { @@ -426,6 +545,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 @@ -461,11 +581,11 @@ wxMimeTypesManager::GetFileTypeFromMimeType(const wxString& mimeType) EnsureImpl(); wxFileType *ft = m_impl->GetFileTypeFromMimeType(mimeType); - if ( ft ) { + if ( !ft ) { // check the fallbacks // - // TODO linear search is potentially slow, perhaps we should use a sorted - // array? + // TODO linear search is potentially slow, perhaps we should use a + // sorted array? size_t count = m_fallbacks.GetCount(); for ( size_t n = 0; n < count; n++ ) { if ( wxMimeTypesManager::IsOfType(mimeType, @@ -517,6 +637,29 @@ size_t wxMimeTypesManager::EnumAllFileTypes(wxArrayString& mimetypes) return countAll; } +void wxMimeTypesManager::Initialize(int mcapStyle, + const wxString& sExtraDir) +{ +#if defined(__UNIX__) && !defined(__CYGWIN__) && !defined(__WINE__) + EnsureImpl(); + + m_impl->Initialize(mcapStyle, sExtraDir); +#else + (void)mcapStyle; + (void)sExtraDir; +#endif // Unix +} + +// and this function clears all the data from the manager +void wxMimeTypesManager::ClearData() +{ +#if defined(__UNIX__) && !defined(__CYGWIN__) && !defined(__WINE__) + EnsureImpl(); + + m_impl->ClearData(); +#endif // Unix +} + // ---------------------------------------------------------------------------- // global data and wxMimeTypeCmnModule // ---------------------------------------------------------------------------- @@ -531,14 +674,17 @@ 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; gs_mimeTypesManager.m_impl = NULL; + gs_mimeTypesManager.m_fallbacks.Clear(); } } @@ -547,3 +693,4 @@ public: IMPLEMENT_DYNAMIC_CLASS(wxMimeTypeCmnModule, wxModule) +#endif // wxUSE_MIMETYPE