]> git.saurik.com Git - wxWidgets.git/commitdiff
Updates to fix an error that cropped up putting EMX stuff into gsocket and a new...
authorDavid Webster <Dave.Webster@bhmi.com>
Fri, 21 Jan 2000 22:19:55 +0000 (22:19 +0000)
committerDavid Webster <Dave.Webster@bhmi.com>
Fri, 21 Jan 2000 22:19:55 +0000 (22:19 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5576 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/os2/gsocket.c
src/os2/makefile.va
src/os2/mimetype.cpp [new file with mode: 0644]

index dadf5ae88676a159cd5ef8a8d0c3e72c80016562..911bf30bad50d583e770028099b4480e792cabc1 100644 (file)
@@ -7,6 +7,7 @@
  */
 
 #include "wx/setup.h"
+#include "wx/defs.h"
 
 #if wxUSE_SOCKETS
 
index 7748d3f325b8944823634917808914e2d150777a..4863d1cb49e3c8a95962b4941fad2800ac119301 100644 (file)
@@ -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 (file)
index 0000000..bee950f
--- /dev/null
@@ -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 <zeitlin@dptmaths.ens-cachan.fr>
+// Licence:     wxWindows license (part of wxExtra library)
+/////////////////////////////////////////////////////////////////////////////
+
+#define INCL_DOS
+#define INCL_GPI
+#define INCL_WIN
+#include <os2.h>
+
+#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 <ctype.h>
+
+// 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: <full path to file>, <icon index>
+            // 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;
+}
+