]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/ole/dataobj.cpp
Needed some variation; got bored of seeing the compilation errors for this
[wxWidgets.git] / src / msw / ole / dataobj.cpp
index 3a5d1fa49d92ee08b1b04ea75de2b1c9ccd3fc60..1699f9dce67f0a6e761eaf7a996ae5657be466d7 100644 (file)
@@ -2,7 +2,7 @@
 // Name:        msw/ole/dataobj.cpp
 // Purpose:     implementation of wx[I]DataObject class
 // Author:      Vadim Zeitlin
 // Name:        msw/ole/dataobj.cpp
 // Purpose:     implementation of wx[I]DataObject class
 // Author:      Vadim Zeitlin
-// Modified by: 
+// Modified by:
 // Created:     10.05.98
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
 // Created:     10.05.98
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
   #pragma hdrstop
 #endif
 
   #pragma hdrstop
 #endif
 
-#include  <wx/defs.h>
+#include "wx/defs.h"
 
 #if defined(__WIN32__) && !defined(__GNUWIN32__)
 
 
 #if defined(__WIN32__) && !defined(__GNUWIN32__)
 
-#include  <wx/log.h>
-#include  <wx/msw/ole/oleutils.h>
-#include  <wx/msw/ole/dataobj.h>
+#include "wx/log.h"
+#include "wx/dataobj.h"
+
+#include <windows.h>
+#include <oleauto.h>
 
 #ifndef __WIN32__
   #include <ole2.h>
   #include <olestd.h>
 #endif
 
 
 #ifndef __WIN32__
   #include <ole2.h>
   #include <olestd.h>
 #endif
 
+#include  "wx/msw/ole/oleutils.h"
+
 // ----------------------------------------------------------------------------
 // functions
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // functions
 // ----------------------------------------------------------------------------
@@ -97,6 +101,39 @@ private:
 // implementation
 // ============================================================================
 
 // implementation
 // ============================================================================
 
+// ----------------------------------------------------------------------------
+// wxDataFormat
+// ----------------------------------------------------------------------------
+
+void wxDataFormat::SetId(const wxChar *format)
+{
+    m_format = ::RegisterClipboardFormat(format);
+    if ( !m_format )
+    {
+        wxLogError(_("Couldn't register clipboard format '%s'."), format);
+    }
+}
+
+wxString wxDataFormat::GetId() const
+{
+    static const int max = 256;
+
+    wxString s;
+
+    wxCHECK_MSG( !IsStandard(), s,
+                 _T("name of predefined format cannot be retrieved") );
+
+    int len = ::GetClipboardFormatName(m_format, s.GetWriteBuf(max), max);
+    s.UngetWriteBuf();
+
+    if ( !len )
+    {
+        wxLogError(_("The clipboard format '%d' doesn't exist."), m_format);
+    }
+
+    return s;
+}
+
 // ----------------------------------------------------------------------------
 // wxIEnumFORMATETC
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // wxIEnumFORMATETC
 // ----------------------------------------------------------------------------
@@ -123,7 +160,7 @@ STDMETHODIMP wxIEnumFORMATETC::Next(ULONG      celt,
                                     FORMATETC *rgelt,
                                     ULONG     *pceltFetched)
 {
                                     FORMATETC *rgelt,
                                     ULONG     *pceltFetched)
 {
-  wxLogTrace("wxIEnumFORMATETC::Next");
+  wxLogTrace(_T("wxIEnumFORMATETC::Next"));
 
   if ( celt > 1 )
     return S_FALSE;
 
   if ( celt > 1 )
     return S_FALSE;
@@ -140,7 +177,7 @@ STDMETHODIMP wxIEnumFORMATETC::Next(ULONG      celt,
 
 STDMETHODIMP wxIEnumFORMATETC::Skip(ULONG celt)
 {
 
 STDMETHODIMP wxIEnumFORMATETC::Skip(ULONG celt)
 {
-  wxLogTrace("wxIEnumFORMATETC::Skip");
+  wxLogTrace(_T("wxIEnumFORMATETC::Skip"));
 
   if ( m_nCurrent == 0 )
     m_nCurrent++;
 
   if ( m_nCurrent == 0 )
     m_nCurrent++;
@@ -150,7 +187,7 @@ STDMETHODIMP wxIEnumFORMATETC::Skip(ULONG celt)
 
 STDMETHODIMP wxIEnumFORMATETC::Reset()
 {
 
 STDMETHODIMP wxIEnumFORMATETC::Reset()
 {
-  wxLogTrace("wxIEnumFORMATETC::Reset");
+  wxLogTrace(_T("wxIEnumFORMATETC::Reset"));
 
   m_nCurrent = 0;
 
 
   m_nCurrent = 0;
 
@@ -159,7 +196,7 @@ STDMETHODIMP wxIEnumFORMATETC::Reset()
 
 STDMETHODIMP wxIEnumFORMATETC::Clone(IEnumFORMATETC **ppenum)
 {
 
 STDMETHODIMP wxIEnumFORMATETC::Clone(IEnumFORMATETC **ppenum)
 {
-  wxLogTrace("wxIEnumFORMATETC::Clone");
+  wxLogTrace(_T("wxIEnumFORMATETC::Clone"));
 
   wxIEnumFORMATETC *pNew = new wxIEnumFORMATETC(m_format.cfFormat);
   pNew->AddRef();
 
   wxIEnumFORMATETC *pNew = new wxIEnumFORMATETC(m_format.cfFormat);
   pNew->AddRef();
@@ -188,7 +225,7 @@ wxIDataObject::wxIDataObject(wxDataObject *pDataObject)
 // get data functions
 STDMETHODIMP wxIDataObject::GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium)
 {
 // get data functions
 STDMETHODIMP wxIDataObject::GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium)
 {
-  wxLogTrace("wxIDataObject::GetData");
+  wxLogTrace(_T("wxIDataObject::GetData"));
 
   // is data is in our format?
   HRESULT hr = QueryGetData(pformatetcIn);
 
   // is data is in our format?
   HRESULT hr = QueryGetData(pformatetcIn);
@@ -220,7 +257,7 @@ STDMETHODIMP wxIDataObject::GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium)
 STDMETHODIMP wxIDataObject::GetDataHere(FORMATETC *pformatetc,
                                         STGMEDIUM *pmedium)
 {
 STDMETHODIMP wxIDataObject::GetDataHere(FORMATETC *pformatetc,
                                         STGMEDIUM *pmedium)
 {
-  wxLogTrace("wxIDataObject::GetDataHere");
+  wxLogTrace(_T("wxIDataObject::GetDataHere"));
 
   // put data in caller provided medium
   if ( pmedium->tymed != TYMED_HGLOBAL )
 
   // put data in caller provided medium
   if ( pmedium->tymed != TYMED_HGLOBAL )
@@ -229,7 +266,7 @@ STDMETHODIMP wxIDataObject::GetDataHere(FORMATETC *pformatetc,
   // copy data
   void *pBuf = GlobalLock(pmedium->hGlobal);
   if ( pBuf == NULL ) {
   // copy data
   void *pBuf = GlobalLock(pmedium->hGlobal);
   if ( pBuf == NULL ) {
-    wxLogLastError("GlobalLock");
+    wxLogLastError(_T("GlobalLock"));
     return E_OUTOFMEMORY;
   }
 
     return E_OUTOFMEMORY;
   }
 
@@ -245,7 +282,7 @@ STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc,
                                     STGMEDIUM *pmedium,
                                     BOOL       fRelease)
 {
                                     STGMEDIUM *pmedium,
                                     BOOL       fRelease)
 {
-  wxLogTrace("wxIDataObject::SetData");
+  wxLogTrace(_T("wxIDataObject::SetData"));
   return E_NOTIMPL;
 }
 
   return E_NOTIMPL;
 }
 
@@ -254,40 +291,40 @@ STDMETHODIMP wxIDataObject::QueryGetData(FORMATETC *pformatetc)
 {
   // do we accept data in this format?
   if ( pformatetc == NULL ) {
 {
   // do we accept data in this format?
   if ( pformatetc == NULL ) {
-    wxLogTrace("wxIDataObject::QueryGetData: invalid ptr.");
+    wxLogTrace(_T("wxIDataObject::QueryGetData: invalid ptr."));
     return E_INVALIDARG;
   }
 
   // the only one allowed by current COM implementation
   if ( pformatetc->lindex != -1 ) {
     return E_INVALIDARG;
   }
 
   // the only one allowed by current COM implementation
   if ( pformatetc->lindex != -1 ) {
-    wxLogTrace("wxIDataObject::QueryGetData: bad lindex %d",
+    wxLogTrace(_T("wxIDataObject::QueryGetData: bad lindex %d"),
                pformatetc->lindex);
     return DV_E_LINDEX;
   }
 
   // we don't support anything other (THUMBNAIL, ICON, DOCPRINT...)
   if ( pformatetc->dwAspect != DVASPECT_CONTENT ) {
                pformatetc->lindex);
     return DV_E_LINDEX;
   }
 
   // we don't support anything other (THUMBNAIL, ICON, DOCPRINT...)
   if ( pformatetc->dwAspect != DVASPECT_CONTENT ) {
-    wxLogTrace("wxIDataObject::QueryGetData: bad dwAspect %d",
+    wxLogTrace(_T("wxIDataObject::QueryGetData: bad dwAspect %d"),
                pformatetc->dwAspect);
     return DV_E_DVASPECT;
   }
 
   // @@ we only transfer data by global memory (bad for large amounts of it!)
   if ( !(pformatetc->tymed & TYMED_HGLOBAL) ) {
                pformatetc->dwAspect);
     return DV_E_DVASPECT;
   }
 
   // @@ we only transfer data by global memory (bad for large amounts of it!)
   if ( !(pformatetc->tymed & TYMED_HGLOBAL) ) {
-    wxLogTrace("wxIDataObject::QueryGetData: %s != TYMED_HGLOBAL.",
+    wxLogTrace(_T("wxIDataObject::QueryGetData: %s != TYMED_HGLOBAL."),
                GetTymedName(pformatetc->tymed));
     return DV_E_TYMED;
   }
 
   // and now check the type of data requested
                GetTymedName(pformatetc->tymed));
     return DV_E_TYMED;
   }
 
   // and now check the type of data requested
-  if ( m_pDataObject->IsSupportedFormat(pformatetc->cfFormat) ) {
-    wxLogTrace("wxIDataObject::QueryGetData: %s ok",
-               wxDataObject::GetFormatName(pformatetc->cfFormat));
+  if ( m_pDataObject->IsSupportedFormat((wxDataFormatId)pformatetc->cfFormat) ) {
+    wxLogTrace(_T("wxIDataObject::QueryGetData: %s ok"),
+               wxDataObject::GetFormatName((wxDataFormatId)pformatetc->cfFormat));
     return S_OK;
   }
   else {
     return S_OK;
   }
   else {
-    wxLogTrace("wxIDataObject::QueryGetData: %s unsupported",
-               wxDataObject::GetFormatName(pformatetc->cfFormat));
+    wxLogTrace(_T("wxIDataObject::QueryGetData: %s unsupported"),
+               wxDataObject::GetFormatName((wxDataFormatId)pformatetc->cfFormat));
     return DV_E_FORMATETC;
   }
 }
     return DV_E_FORMATETC;
   }
 }
@@ -295,7 +332,7 @@ STDMETHODIMP wxIDataObject::QueryGetData(FORMATETC *pformatetc)
 STDMETHODIMP wxIDataObject::GetCanonicalFormatEtc(FORMATETC *pFormatetcIn,
                                                   FORMATETC *pFormatetcOut)
 {
 STDMETHODIMP wxIDataObject::GetCanonicalFormatEtc(FORMATETC *pFormatetcIn,
                                                   FORMATETC *pFormatetcOut)
 {
-  wxLogTrace("wxIDataObject::GetCanonicalFormatEtc");
+  wxLogTrace(_T("wxIDataObject::GetCanonicalFormatEtc"));
 
   // @@ implementation is trivial, we might want something better here
   if ( pFormatetcOut != NULL )
 
   // @@ implementation is trivial, we might want something better here
   if ( pFormatetcOut != NULL )
@@ -306,14 +343,14 @@ STDMETHODIMP wxIDataObject::GetCanonicalFormatEtc(FORMATETC *pFormatetcIn,
 STDMETHODIMP wxIDataObject::EnumFormatEtc(DWORD dwDirection,
                                           IEnumFORMATETC **ppenumFormatEtc)
 {
 STDMETHODIMP wxIDataObject::EnumFormatEtc(DWORD dwDirection,
                                           IEnumFORMATETC **ppenumFormatEtc)
 {
-  wxLogTrace("wxIDataObject::EnumFormatEtc");
+  wxLogTrace(_T("wxIDataObject::EnumFormatEtc"));
 
   if ( dwDirection == DATADIR_SET ) {
     // we don't allow setting of data anyhow
     return E_NOTIMPL;
   }
 
 
   if ( dwDirection == DATADIR_SET ) {
     // we don't allow setting of data anyhow
     return E_NOTIMPL;
   }
 
-  wxIEnumFORMATETC *pEnum = 
+  wxIEnumFORMATETC *pEnum =
     new wxIEnumFORMATETC(m_pDataObject->GetPreferredFormat());
   pEnum->AddRef();
   *ppenumFormatEtc = pEnum;
     new wxIEnumFORMATETC(m_pDataObject->GetPreferredFormat());
   pEnum->AddRef();
   *ppenumFormatEtc = pEnum;
@@ -358,6 +395,11 @@ wxDataObject::~wxDataObject()
 const char *wxDataObject::GetFormatName(wxDataFormat format)
 {
 #ifdef __WXDEBUG__
 const char *wxDataObject::GetFormatName(wxDataFormat format)
 {
 #ifdef __WXDEBUG__
+  // case 'xxx' is not a valid value for switch of enum 'wxDataFormat'
+  #ifdef __VISUALC__
+    #pragma warning(disable:4063)
+  #endif // VC++
+
   static char s_szBuf[128];
   switch ( format ) {
     case CF_TEXT:         return "CF_TEXT";
   static char s_szBuf[128];
   switch ( format ) {
     case CF_TEXT:         return "CF_TEXT";
@@ -380,9 +422,55 @@ const char *wxDataObject::GetFormatName(wxDataFormat format)
       sprintf(s_szBuf, "clipboard format %d (unknown)", format);
       return s_szBuf;
   }
       sprintf(s_szBuf, "clipboard format %d (unknown)", format);
       return s_szBuf;
   }
- #else
+
+  #ifdef __VISUALC__
+    #pragma warning(default:4063)
+  #endif // VC++
+
+#else // !Debug
   return "";
   return "";
-#endif
+#endif // Debug
+}
+
+// ----------------------------------------------------------------------------
+// wxPrivateDataObject
+// ----------------------------------------------------------------------------
+
+wxPrivateDataObject::wxPrivateDataObject()
+{
+    m_size = 0;
+    m_data = NULL;
+}
+
+void wxPrivateDataObject::Free()
+{
+    if ( m_data )
+        free(m_data);
+}
+
+void wxPrivateDataObject::SetData( const void *data, size_t size )
+{
+    Free();
+
+    m_size = size;
+    m_data = malloc(size);
+
+    memcpy( m_data, data, size );
+}
+
+void wxPrivateDataObject::WriteData( void *dest ) const
+{
+    WriteData( m_data, dest );
+}
+
+size_t wxPrivateDataObject::GetSize() const
+{
+    return m_size;
+}
+
+void wxPrivateDataObject::WriteData( const void *data, void *dest ) const
+{
+    memcpy( dest, data, GetSize() );
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------
@@ -405,5 +493,7 @@ static const char *GetTymedName(DWORD tymed)
   }
 }
 
   }
 }
 
+// TODO: OLE parts of wxBitmap/File/MetafileDataObject
+
 #endif
 
 #endif