From 1cd04aa2e1c4ec7ff9425cb8114211c7885dcd22 Mon Sep 17 00:00:00 2001 From: David Webster Date: Fri, 21 Jan 2000 22:19:55 +0000 Subject: [PATCH] Updates to fix an error that cropped up putting EMX stuff into gsocket and a new makefile for VA V3.0 to inldue new mime stuff and plot module git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5576 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/os2/gsocket.c | 1 + src/os2/makefile.va | 32 ++-- src/os2/mimetype.cpp | 438 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 458 insertions(+), 13 deletions(-) create mode 100644 src/os2/mimetype.cpp diff --git a/src/os2/gsocket.c b/src/os2/gsocket.c index dadf5ae886..911bf30bad 100644 --- a/src/os2/gsocket.c +++ b/src/os2/gsocket.c @@ -7,6 +7,7 @@ */ #include "wx/setup.h" +#include "wx/defs.h" #if wxUSE_SOCKETS diff --git a/src/os2/makefile.va b/src/os2/makefile.va index 7748d3f325..4863d1cb49 100644 --- a/src/os2/makefile.va +++ b/src/os2/makefile.va @@ -112,6 +112,7 @@ GENERICOBJS= \ ..\generic\$D\logg.obj \ ..\generic\$D\numdlgg.obj \ ..\generic\$D\panelg.obj \ + ..\generic\$D\plot.obj \ ..\generic\$D\printps.obj \ ..\generic\$D\prntdlgg.obj \ ..\generic\$D\progdlgg.obj \ @@ -148,6 +149,7 @@ GENLIBOBJS= \ logg.obj \ numdlgg.obj \ panelg.obj \ + plot.obj \ printps.obj \ prntdlgg.obj \ progdlgg.obj \ @@ -225,7 +227,7 @@ COMMONOBJS = \ ..\common\$D\matrix.obj \ ..\common\$D\memory.obj \ ..\common\$D\menucmn.obj \ - ..\common\$D\mimetype.obj \ + ..\common\$D\mimecmn.obj \ ..\common\$D\module.obj \ ..\common\$D\mstream.obj \ ..\common\$D\object.obj \ @@ -324,7 +326,7 @@ COMLIBOBJS2 = \ matrix.obj \ memory.obj \ menucmn.obj \ - mimetype.obj \ + mimecmn.obj \ module.obj \ mstream.obj \ object.obj \ @@ -412,6 +414,7 @@ OS2OBJS = \ ..\os2\$D\menu.obj \ ..\os2\$D\menuitem.obj \ ..\os2\$D\metafile.obj \ + ..\os2\$D\mimetype.obj \ ..\os2\$D\minifram.obj \ ..\os2\$D\msgdlg.obj \ ..\os2\$D\nativdlg.obj \ @@ -490,9 +493,10 @@ OS2LIBOBJS1 = \ menu.obj \ menuitem.obj \ metafile.obj \ - minifram.obj + mimetype.obj OS2LIBOBJS2 = \ + minifram.obj \ msgdlg.obj \ nativdlg.obj \ notebook.obj \ @@ -577,6 +581,14 @@ dirs: $(OS2DIR)\$D $(COMMDIR)\$D $(GENDIR)\$D $(HTMLDIR)\$D test: $(OS2DIR)\$D\wave.obj test2: ..\common\Debug\config.obj +$D\dummy.obj: dummy.$(SRCSUFF) $(WXDIR)\include\wx\wx.h $(WXDIR)\include\wx\os2\setup.h + icc $(CPPFLAGS) $(MAKEPRECOMP) /Fo$D\dummy.obj /Tp dummy.cpp + +$D\dummydll.obj: dummydll.$(SRCSUFF) $(WXDIR)\include\wx\wx.h $(WXDIR)\include\wx\os2\setup.h + icc @<< +$(CPPFLAGS) $(MAKEPRECOMP) /Fo$D\dummydll.obj /c /Tp dummydll.cpp +<< + $(COMLIBOBJS1): copy ..\common\$D\appcmn.obj copy ..\common\$D\choiccmn.obj @@ -635,7 +647,7 @@ $(COMLIBOBJS2): copy ..\common\$D\matrix.obj copy ..\common\$D\memory.obj copy ..\common\$D\menucmn.obj - copy ..\common\$D\mimetype.obj + copy ..\common\$D\mimecmn.obj copy ..\common\$D\module.obj copy ..\common\$D\mstream.obj copy ..\common\$D\object.obj @@ -696,6 +708,7 @@ $(GENLIBOBJS): copy ..\generic\$D\logg.obj copy ..\generic\$D\numdlgg.obj copy ..\generic\$D\panelg.obj + copy ..\generic\$D\plot.obj copy ..\generic\$D\printps.obj copy ..\generic\$D\prntdlgg.obj copy ..\generic\$D\progdlgg.obj @@ -776,9 +789,10 @@ $(OS2LIBOBJS1): copy ..\os2\$D\menu.obj copy ..\os2\$D\menuitem.obj copy ..\os2\$D\metafile.obj - copy ..\os2\$D\minifram.obj + copy ..\os2\$D\mimetype.obj $(OS2LIBOBJS2): + copy ..\os2\$D\minifram.obj copy ..\os2\$D\msgdlg.obj copy ..\os2\$D\nativdlg.obj copy ..\os2\$D\notebook.obj @@ -945,14 +959,6 @@ $(WXDIR)\lib\wx200.dll: $(OBJECTS) $(WXDIR)\lib\wx210.lib !endif -$D\dummy.obj: dummy.$(SRCSUFF) $(WXDIR)\include\wx\wx.h $(WXDIR)\include\wx\os2\setup.h - icc $(CPPFLAGS) $(MAKEPRECOMP) /Fo$D\dummy.obj /Tp dummy.cpp - -$D\dummydll.obj: dummydll.$(SRCSUFF) $(WXDIR)\include\wx\wx.h $(WXDIR)\include\wx\os2\setup.h - icc @<< -$(CPPFLAGS) $(MAKEPRECOMP) /Fo$D\dummydll.obj /c /Tp dummydll.cpp -<< - # If taking wxWindows from CVS, setup.h doesn't exist yet. $(WXDIR)\include\wx\os2\setup.h: $(WXDIR)\include\wx\os2\setup0.h copy "$(WXDIR)"\include\wx\os2\setup.h "$(WXDIR)"\include\wx\os2\setup.bak diff --git a/src/os2/mimetype.cpp b/src/os2/mimetype.cpp new file mode 100644 index 0000000000..bee950fe6d --- /dev/null +++ b/src/os2/mimetype.cpp @@ -0,0 +1,438 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: common/mimetype.cpp +// Purpose: classes and functions to manage MIME types +// Author: David Webster +// Modified by: +// Created: 01.21.00 +// RCS-ID: $Id$ +// Copyright: Adopted from msw port --(c) 1998 Vadim Zeitlin +// Licence: wxWindows license (part of wxExtra library) +///////////////////////////////////////////////////////////////////////////// + +#define INCL_DOS +#define INCL_GPI +#define INCL_WIN +#include + +#ifndef WX_PRECOMP + #include "wx/string.h" + #if wxUSE_GUI + #include "wx/icon.h" + #endif +#endif //WX_PRECOMP + +#include "wx/log.h" +#include "wx/file.h" +#include "wx/intl.h" +#include "wx/dynarray.h" +#include "wx/confbase.h" + +#include "wx/os2/mimetype.h" + +// other standard headers +#include + +// in case we're compiling in non-GUI mode +class WXDLLEXPORT wxIcon; + +// These classes use Windows registry to retrieve the required information. +// +// Keys used (not all of them are documented, so it might actually stop working +// in futur versions of Windows...): +// 1. "HKCR\MIME\Database\Content Type" contains subkeys for all known MIME +// types, each key has a string value "Extension" which gives (dot preceded) +// extension for the files of this MIME type. +// +// 2. "HKCR\.ext" contains +// a) unnamed value containing the "filetype" +// b) value "Content Type" containing the MIME type +// +// 3. "HKCR\filetype" contains +// a) unnamed value containing the description +// b) subkey "DefaultIcon" with single unnamed value giving the icon index in +// an icon file +// c) shell\open\command and shell\open\print subkeys containing the commands +// to open/print the file (the positional parameters are introduced by %1, +// %2, ... in these strings, we change them to %s ourselves) + +// although I don't know of any official documentation which mentions this +// location, uses it, so it isn't likely to change +static const wxChar *MIME_DATABASE_KEY = wxT("MIME\\Database\\Content Type\\"); + +wxString wxFileTypeImpl::GetCommand(const wxChar *verb) const +{ +// TODO: OS/2 doesn't have a registry but uses Prf +/* + // suppress possible error messages + wxLogNull nolog; + wxString strKey; + + if ( wxRegKey(wxRegKey::HKCR, m_ext + _T("\\shell")).Exists() ) + strKey = m_ext; + if ( wxRegKey(wxRegKey::HKCR, m_strFileType + _T("\\shell")).Exists() ) + strKey = m_strFileType; + + if ( !strKey ) + { + // no info + return wxEmptyString; + } + + strKey << wxT("\\shell\\") << verb; + wxRegKey key(wxRegKey::HKCR, strKey + _T("\\command")); + wxString command; + if ( key.Open() ) { + // it's the default value of the key + if ( key.QueryValue(wxT(""), command) ) { + // transform it from '%1' to '%s' style format string (now also + // test for %L - apparently MS started using it as well for the + // same purpose) + + // NB: we don't make any attempt to verify that the string is valid, + // i.e. doesn't contain %2, or second %1 or .... But we do make + // sure that we return a string with _exactly_ one '%s'! + bool foundFilename = FALSE; + size_t len = command.Len(); + for ( size_t n = 0; (n < len) && !foundFilename; n++ ) { + if ( command[n] == wxT('%') && + (n + 1 < len) && + (command[n + 1] == wxT('1') || + command[n + 1] == wxT('L')) ) { + // replace it with '%s' + command[n + 1] = wxT('s'); + + foundFilename = TRUE; + } + } + +#if wxUSE_DDE + // look whether we must issue some DDE requests to the application + // (and not just launch it) + strKey += _T("\\DDEExec"); + wxRegKey keyDDE(wxRegKey::HKCR, strKey); + if ( keyDDE.Open() ) { + wxString ddeCommand, ddeServer, ddeTopic; + keyDDE.QueryValue(_T(""), ddeCommand); + ddeCommand.Replace(_T("%1"), _T("%s")); + + wxRegKey(wxRegKey::HKCR, strKey + _T("\\Application")). + QueryValue(_T(""), ddeServer); + wxRegKey(wxRegKey::HKCR, strKey + _T("\\Topic")). + QueryValue(_T(""), ddeTopic); + + // HACK: we use a special feature of wxExecute which exists + // just because we need it here: it will establish DDE + // conversation with the program it just launched + command.Prepend(_T("WX_DDE#")); + command << _T('#') << ddeServer + << _T('#') << ddeTopic + << _T('#') << ddeCommand; + } + else +#endif // wxUSE_DDE + if ( !foundFilename ) { + // we didn't find any '%1' - the application doesn't know which + // file to open (note that we only do it if there is no DDEExec + // subkey) + // + // HACK: append the filename at the end, hope that it will do + command << wxT(" %s"); + } + } + } + //else: no such file type or no value, will return empty string + + return command; +*/ + return wxEmptyString; +} + +bool +wxFileTypeImpl::GetOpenCommand(wxString *openCmd, + const wxFileType::MessageParameters& params) + const +{ + wxString cmd; + if ( m_info ) { + cmd = m_info->GetOpenCommand(); + } + else { + cmd = GetCommand(wxT("open")); + } + + *openCmd = wxFileType::ExpandCommand(cmd, params); + + return !openCmd->IsEmpty(); +} + +bool +wxFileTypeImpl::GetPrintCommand(wxString *printCmd, + const wxFileType::MessageParameters& params) + const +{ + wxString cmd; + if ( m_info ) { + cmd = m_info->GetPrintCommand(); + } + else { + cmd = GetCommand(wxT("print")); + } + + *printCmd = wxFileType::ExpandCommand(cmd, params); + + return !printCmd->IsEmpty(); +} + +// TODO this function is half implemented +bool wxFileTypeImpl::GetExtensions(wxArrayString& extensions) +{ + if ( m_info ) { + extensions = m_info->GetExtensions(); + + return TRUE; + } + else if ( m_ext.IsEmpty() ) { + // the only way to get the list of extensions from the file type is to + // scan through all extensions in the registry - too slow... + return FALSE; + } + else { + extensions.Empty(); + extensions.Add(m_ext); + + // it's a lie too, we don't return _all_ extensions... + return TRUE; + } +} + +bool wxFileTypeImpl::GetMimeType(wxString *mimeType) const +{ + if ( m_info ) { + // we already have it + *mimeType = m_info->GetMimeType(); + + return TRUE; + } + + // suppress possible error messages + wxLogNull nolog; +// TODO: substitue reg key stuff (maybe make a Prf class for OS/2??) +/* + wxRegKey key(wxRegKey::HKCR, wxT(".") + m_ext); + if ( key.Open() && key.QueryValue(wxT("Content Type"), *mimeType) ) { + return TRUE; + } + else { + return FALSE; + } +*/ + return FALSE; +} + +bool wxFileTypeImpl::GetIcon(wxIcon *icon) const +{ +#if wxUSE_GUI + if ( m_info ) { + // we don't have icons in the fallback resources + return FALSE; + } + + wxString strIconKey; + strIconKey << m_strFileType << wxT("\\DefaultIcon"); + + // suppress possible error messages + wxLogNull nolog; +//TODO: +/* + wxRegKey key(wxRegKey::HKCR, strIconKey); + + if ( key.Open() ) { + wxString strIcon; + // it's the default value of the key + if ( key.QueryValue(wxT(""), strIcon) ) { + // the format is the following: , + // NB: icon index may be negative as well as positive and the full + // path may contain the environment variables inside '%' + wxString strFullPath = strIcon.BeforeLast(wxT(',')), + strIndex = strIcon.AfterLast(wxT(',')); + + // index may be omitted, in which case BeforeLast(',') is empty and + // AfterLast(',') is the whole string + if ( strFullPath.IsEmpty() ) { + strFullPath = strIndex; + strIndex = wxT("0"); + } + + wxString strExpPath = wxExpandEnvVars(strFullPath); + int nIndex = wxAtoi(strIndex); + + HICON hIcon = ExtractIcon(GetModuleHandle(NULL), strExpPath, nIndex); + switch ( (int)hIcon ) { + case 0: // means no icons were found + case 1: // means no such file or it wasn't a DLL/EXE/OCX/ICO/... + wxLogDebug(wxT("incorrect registry entry '%s': no such icon."), + key.GetName().c_str()); + break; + + default: + icon->SetHICON((WXHICON)hIcon); + return TRUE; + } + } + } + + // no such file type or no value or incorrect icon entry +*/ +#endif // wxUSE_GUI + return FALSE; +} + +bool wxFileTypeImpl::GetDescription(wxString *desc) const +{ + if ( m_info ) { + // we already have it + *desc = m_info->GetDescription(); + + return TRUE; + } + + // suppress possible error messages + wxLogNull nolog; +// TODO: +/* + wxRegKey key(wxRegKey::HKCR, m_strFileType); + + if ( key.Open() ) { + // it's the default value of the key + if ( key.QueryValue(wxT(""), *desc) ) { + return TRUE; + } + } +*/ + return FALSE; +} + +// extension -> file type +wxFileType * +wxMimeTypesManagerImpl::GetFileTypeFromExtension(const wxString& ext) +{ + // add the leading point if necessary + wxString str; + if ( ext[0u] != wxT('.') ) { + str = wxT('.'); + } + str << ext; + + // suppress possible error messages + wxLogNull nolog; + + bool knownExtension = FALSE; + + wxString strFileType; +// TODO: +/* + wxRegKey key(wxRegKey::HKCR, str); + if ( key.Open() ) { + // it's the default value of the key + if ( key.QueryValue(wxT(""), strFileType) ) { + // create the new wxFileType object + wxFileType *fileType = new wxFileType; + fileType->m_impl->Init(strFileType, ext); + + return fileType; + } + else { + // this extension doesn't have a filetype, but it's known to the + // system and may be has some other useful keys (open command or + // content-type), so still return a file type object for it + knownExtension = TRUE; + } + } +*/ + // check the fallbacks + // 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 ( m_fallbacks[n].GetExtensions().Index(ext) != wxNOT_FOUND ) { + wxFileType *fileType = new wxFileType; + fileType->m_impl->Init(m_fallbacks[n]); + + return fileType; + } + } + + if ( knownExtension ) + { + wxFileType *fileType = new wxFileType; + fileType->m_impl->Init(wxEmptyString, ext); + + return fileType; + } + else + { + // unknown extension + return NULL; + } +} + +// MIME type -> extension -> file type +wxFileType * +wxMimeTypesManagerImpl::GetFileTypeFromMimeType(const wxString& mimeType) +{ + wxString strKey = MIME_DATABASE_KEY; + strKey << mimeType; + + // suppress possible error messages + wxLogNull nolog; + + wxString ext; +// TODO: +/* + wxRegKey key(wxRegKey::HKCR, strKey); + if ( key.Open() ) { + if ( key.QueryValue(wxT("Extension"), ext) ) { + return GetFileTypeFromExtension(ext); + } + } + + // check the fallbacks + // 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, + m_fallbacks[n].GetMimeType()) ) { + wxFileType *fileType = new wxFileType; + fileType->m_impl->Init(m_fallbacks[n]); + + return fileType; + } + } +*/ + // unknown MIME type + return NULL; +} + +size_t wxMimeTypesManagerImpl::EnumAllFileTypes(wxArrayString& mimetypes) +{ + // enumerate all keys under MIME_DATABASE_KEY +// TODO: +/* + wxRegKey key(wxRegKey::HKCR, MIME_DATABASE_KEY); + + wxString type; + long cookie; + bool cont = key.GetFirstKey(type, cookie); + while ( cont ) + { + mimetypes.Add(type); + + cont = key.GetNextKey(type, cookie); + } + + return mimetypes.GetCount(); +*/ + return 0; +} + -- 2.45.2