]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/ole/dataobj.cpp
Applied patch [ 1340814 ] fix for wxTextCtrl::GetStyle
[wxWidgets.git] / src / msw / ole / dataobj.cpp
index 7ecdb81d3bb1ea4953f8a6d4690cfaac06a26f21..b6da92aa47a655da5d1060c6f72a3d64779f6678 100644 (file)
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
-    #pragma implementation "dataobj.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 
 #include "wx/msw/private.h"         // includes <windows.h>
 
+#ifdef __WXWINCE__
+#include <winreg.h>
+#endif
+
 // for some compilers, the entire ole2.h must be included, not only oleauto.h
-#if wxUSE_NORLANDER_HEADERS || defined(__WATCOMC__)
+#if wxUSE_NORLANDER_HEADERS || defined(__WATCOMC__) || defined(__WXWINCE__)
   #include <ole2.h>
 #endif
 
@@ -62,7 +62,7 @@
 #ifdef __WXDEBUG__
     static const wxChar *GetTymedName(DWORD tymed);
 #else // !Debug
-    #define GetTymedName(tymed) _T("")
+    #define GetTymedName(tymed) wxEmptyString
 #endif // Debug/!Debug
 
 // ----------------------------------------------------------------------------
@@ -102,9 +102,9 @@ public:
     virtual ~wxIDataObject();
 
     // normally, wxDataObject controls our lifetime (i.e. we're deleted when it
-    // is), but in some cases, the situation is inversed, that is we delete it
+    // is), but in some cases, the situation is reversed, that is we delete it
     // when this object is deleted - setting this flag enables such logic
-    void SetDeleteFlag() { m_mustDelete = TRUE; }
+    void SetDeleteFlag() { m_mustDelete = true; }
 
     DECLARE_IUNKNOWN_METHODS;
 
@@ -153,8 +153,7 @@ wxString wxDataFormat::GetId() const
     wxCHECK_MSG( !IsStandard(), s,
                  wxT("name of predefined format cannot be retrieved") );
 
-    int len = ::GetClipboardFormatName(m_format, s.GetWriteBuf(max), max);
-    s.UngetWriteBuf();
+    int len = ::GetClipboardFormatName(m_format, wxStringBuffer(s, max), max);
 
     if ( !len )
     {
@@ -187,31 +186,27 @@ wxIEnumFORMATETC::wxIEnumFORMATETC(const wxDataFormat *formats, ULONG nCount)
 
 STDMETHODIMP wxIEnumFORMATETC::Next(ULONG      celt,
                                     FORMATETC *rgelt,
-                                    ULONG     *WXUNUSED(pceltFetched))
+                                    ULONG     *pceltFetched)
 {
     wxLogTrace(wxTRACE_OleCalls, wxT("wxIEnumFORMATETC::Next"));
 
-    if ( celt > 1 ) {
-        // we only return 1 element at a time - mainly because I'm too lazy to
-        // implement something which you're never asked for anyhow
-        return S_FALSE;
-    }
-
-    if ( m_nCurrent < m_nCount ) {
+    ULONG numFetched = 0;
+    while (m_nCurrent < m_nCount && numFetched < celt) {
         FORMATETC format;
         format.cfFormat = m_formats[m_nCurrent++];
         format.ptd      = NULL;
         format.dwAspect = DVASPECT_CONTENT;
         format.lindex   = -1;
         format.tymed    = TYMED_HGLOBAL;
-        *rgelt = format;
 
-        return S_OK;
-    }
-    else {
-        // bad index
-        return S_FALSE;
+        *rgelt++ = format;
+        numFetched++;
     }
+
+    if (pceltFetched)
+        *pceltFetched = numFetched;
+
+    return numFetched == celt ? S_OK : S_FALSE;
 }
 
 STDMETHODIMP wxIEnumFORMATETC::Skip(ULONG celt)
@@ -268,7 +263,7 @@ IMPLEMENT_IUNKNOWN_METHODS(wxIDataObject)
 wxIDataObject::wxIDataObject(wxDataObject *pDataObject)
 {
     m_pDataObject = pDataObject;
-    m_mustDelete = FALSE;
+    m_mustDelete = false;
 }
 
 wxIDataObject::~wxIDataObject()
@@ -303,6 +298,7 @@ STDMETHODIMP wxIDataObject::GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium)
             pmedium->tymed = TYMED_ENHMF;
             break;
 
+#ifndef __WXWINCE__
         case wxDF_METAFILE:
             pmedium->hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE,
                                            sizeof(METAFILEPICT));
@@ -312,7 +308,7 @@ STDMETHODIMP wxIDataObject::GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium)
             }
             pmedium->tymed = TYMED_MFPICT;
             break;
-
+#endif
         default:
             // alloc memory
             size_t size = m_pDataObject->GetDataSize(format);
@@ -410,19 +406,6 @@ STDMETHODIMP wxIDataObject::GetDataHere(FORMATETC *pformatetc,
     return S_OK;
 }
 
-#ifdef __DIGITALMARS__
-extern "C"
-size_t wxDataObjectComposite::GetBufferOffset( const wxDataFormat& format );
-
-extern "C"
-const void* wxDataObjectComposite::GetSizeFromBuffer( const void* buffer,
-                                                      size_t* size,
-                                                      const wxDataFormat& format ) ;
-extern "C"
-void* wxDataObjectComposite::SetSizeInBuffer( void* buffer, size_t size,
-                                              const wxDataFormat& format ) ;
-
-#endif
 
 // set data functions
 STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc,
@@ -478,7 +461,7 @@ STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc,
                     case CF_OEMTEXT:
                         size = strlen((const char *)pBuf);
                         break;
-#if !defined(__WATCOMC__) && ! (defined(__BORLANDC__) && (__BORLANDC__ < 0x500))
+#if !(defined(__BORLANDC__) && (__BORLANDC__ < 0x500))
                     case CF_UNICODETEXT:
 #if ( defined(__BORLANDC__) && (__BORLANDC__ > 0x530) ) \
     || ( defined(__MWERKS__) && defined(__WXMSW__) )
@@ -489,11 +472,13 @@ STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc,
                         break;
 #endif
                     case CF_BITMAP:
+#ifndef __WXWINCE__
                     case CF_HDROP:
                         // these formats don't use size at all, anyhow (but
                         // pass data by handle, which is always a single DWORD)
                         size = 0;
                         break;
+#endif
 
                     case CF_DIB:
                         // the handler will calculate size itself (it's too
@@ -501,16 +486,17 @@ STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc,
                         size = 0;
                         break;
 
+#ifndef __WXWINCE__
                     case CF_METAFILEPICT:
                         size = sizeof(METAFILEPICT);
                         break;
-
+#endif
                     default:
                         {
                             // we suppose that the size precedes the data
                             pBuf = m_pDataObject->GetSizeFromBuffer( pBuf, &size, format );
                             if (! format.IsStandard() ) {
-                                // see GetData for coresponding increment
+                                // see GetData for corresponding increment
                                 size -= m_pDataObject->GetBufferOffset( format  );
                             }
                         }
@@ -634,7 +620,7 @@ STDMETHODIMP wxIDataObject::EnumFormatEtc(DWORD dwDir,
     wxDataObject::Direction dir = dwDir == DATADIR_GET ? wxDataObject::Get
                                                        : wxDataObject::Set;
 
-    size_t nFormatCount = m_pDataObject->GetFormatCount(dir);
+    ULONG nFormatCount = wx_truncate_cast(ULONG, m_pDataObject->GetFormatCount(dir));
     wxDataFormat format;
     wxDataFormat *formats;
     formats = nFormatCount == 1 ? &format : new wxDataFormat[nFormatCount];
@@ -733,7 +719,6 @@ const wxChar *wxDataObject::GetFormatName(wxDataFormat format)
     switch ( format ) {
         case CF_TEXT:         return wxT("CF_TEXT");
         case CF_BITMAP:       return wxT("CF_BITMAP");
-        case CF_METAFILEPICT: return wxT("CF_METAFILEPICT");
         case CF_SYLK:         return wxT("CF_SYLK");
         case CF_DIF:          return wxT("CF_DIF");
         case CF_TIFF:         return wxT("CF_TIFF");
@@ -744,9 +729,12 @@ const wxChar *wxDataObject::GetFormatName(wxDataFormat format)
         case CF_RIFF:         return wxT("CF_RIFF");
         case CF_WAVE:         return wxT("CF_WAVE");
         case CF_UNICODETEXT:  return wxT("CF_UNICODETEXT");
+#ifndef __WXWINCE__
+        case CF_METAFILEPICT: return wxT("CF_METAFILEPICT");
         case CF_ENHMETAFILE:  return wxT("CF_ENHMETAFILE");
-        case CF_HDROP:        return wxT("CF_HDROP");
         case CF_LOCALE:       return wxT("CF_LOCALE");
+        case CF_HDROP:        return wxT("CF_HDROP");
+#endif
 
         default:
             if ( !::GetClipboardFormatName(format, s_szBuf, WXSIZEOF(s_szBuf)) )
@@ -769,20 +757,32 @@ const wxChar *wxDataObject::GetFormatName(wxDataFormat format)
 // wxBitmapDataObject supports CF_DIB format
 // ----------------------------------------------------------------------------
 
+// TODO: support CF_DIB under Windows CE as well
+
 size_t wxBitmapDataObject::GetDataSize() const
 {
+#if wxUSE_WXDIB && !defined(__WXWINCE__)
     return wxDIB::ConvertFromBitmap(NULL, GetHbitmapOf(GetBitmap()));
+#else
+    return 0;
+#endif
 }
 
 bool wxBitmapDataObject::GetDataHere(void *buf) const
 {
+#if wxUSE_WXDIB && !defined(__WXWINCE__)
     BITMAPINFO * const pbi = (BITMAPINFO *)buf;
 
     return wxDIB::ConvertFromBitmap(pbi, GetHbitmapOf(GetBitmap())) != 0;
+#else
+    wxUnusedVar(buf);
+    return false;
+#endif
 }
 
 bool wxBitmapDataObject::SetData(size_t WXUNUSED(len), const void *buf)
 {
+#if wxUSE_WXDIB && !defined(__WXWINCE__)
     const BITMAPINFO * const pbmi = (const BITMAPINFO *)buf;
 
     HBITMAP hbmp = wxDIB::ConvertToBitmap(pbmi);
@@ -797,7 +797,11 @@ bool wxBitmapDataObject::SetData(size_t WXUNUSED(len), const void *buf)
 
     SetBitmap(bitmap);
 
-    return TRUE;
+    return true;
+#else
+    wxUnusedVar(buf);
+    return false;
+#endif
 }
 
 // ----------------------------------------------------------------------------
@@ -819,7 +823,7 @@ bool wxBitmapDataObject2::GetDataHere(void *pBuf) const
     // we put a bitmap handle into pBuf
     *(WXHBITMAP *)pBuf = GetBitmap().GetHBITMAP();
 
-    return TRUE;
+    return true;
 }
 
 bool wxBitmapDataObject2::SetData(size_t WXUNUSED(len), const void *pBuf)
@@ -838,12 +842,12 @@ bool wxBitmapDataObject2::SetData(size_t WXUNUSED(len), const void *pBuf)
     if ( !bitmap.Ok() ) {
         wxFAIL_MSG(wxT("pasting/dropping invalid bitmap"));
 
-        return FALSE;
+        return false;
     }
 
     SetBitmap(bitmap);
 
-    return TRUE;
+    return true;
 }
 
 #if 0
@@ -908,7 +912,7 @@ bool wxBitmapDataObject::GetDataHere(const wxDataFormat& format,
         {
             wxLogLastError(wxT("GetDIBits"));
 
-            return FALSE;
+            return false;
         }
     }
     else // CF_BITMAP
@@ -917,7 +921,7 @@ bool wxBitmapDataObject::GetDataHere(const wxDataFormat& format,
         *(HBITMAP *)pBuf = hbmp;
     }
 
-    return TRUE;
+    return true;
 }
 
 bool wxBitmapDataObject::SetData(const wxDataFormat& format,
@@ -962,7 +966,7 @@ bool wxBitmapDataObject::SetData(const wxDataFormat& format,
 
     wxASSERT_MSG( m_bitmap.Ok(), wxT("pasting invalid bitmap") );
 
-    return TRUE;
+    return true;
 }
 
 #endif // 0
@@ -971,8 +975,10 @@ bool wxBitmapDataObject::SetData(const wxDataFormat& format,
 // wxFileDataObject
 // ----------------------------------------------------------------------------
 
-bool wxFileDataObject::SetData(size_t WXUNUSED(size), const void *pData)
+bool wxFileDataObject::SetData(size_t WXUNUSED(size),
+                               const void *WXUNUSED_IN_WINCE(pData))
 {
+#ifndef __WXWINCE__
     m_filenames.Empty();
 
     // the documentation states that the first member of DROPFILES structure is
@@ -995,8 +1001,7 @@ bool wxFileDataObject::SetData(size_t WXUNUSED(size), const void *pData)
         // +1 for terminating NUL
         len = ::DragQueryFile(hdrop, n, NULL, 0) + 1;
 
-        UINT len2 = ::DragQueryFile(hdrop, n, str.GetWriteBuf(len), len);
-        str.UngetWriteBuf();
+        UINT len2 = ::DragQueryFile(hdrop, n, wxStringBuffer(str, len), len);
         m_filenames.Add(str);
 
         if ( len2 != len - 1 ) {
@@ -1005,7 +1010,10 @@ bool wxFileDataObject::SetData(size_t WXUNUSED(size), const void *pData)
         }
     }
 
-    return TRUE;
+    return true;
+#else
+    return false;
+#endif
 }
 
 void wxFileDataObject::AddFile(const wxString& file)
@@ -1018,6 +1026,7 @@ void wxFileDataObject::AddFile(const wxString& file)
 
 size_t wxFileDataObject::GetDataSize() const
 {
+#ifndef __WXWINCE__
     // size returned will be the size of the DROPFILES structure,
     // plus the list of filesnames (null byte separated), plus
     // a double null at the end
@@ -1027,26 +1036,30 @@ size_t wxFileDataObject::GetDataSize() const
         return 0;
 
     // inital size of DROPFILES struct + null byte
-    size_t sz = sizeof(DROPFILES) + 1;
+    size_t sz = sizeof(DROPFILES) + (1 * sizeof(wxChar));
 
     size_t count = m_filenames.GetCount();
     for ( size_t i = 0; i < count; i++ )
     {
         // add filename length plus null byte
-        sz += m_filenames[i].Len() + 1;
+        sz += (m_filenames[i].Len() + 1) * sizeof(wxChar);
     }
 
     return sz;
+#else
+    return 0;
+#endif
 }
 
-bool wxFileDataObject::GetDataHere(void *pData) const
+bool wxFileDataObject::GetDataHere(void *WXUNUSED_IN_WINCE(pData)) const
 {
+#ifndef __WXWINCE__
     // pData points to an externally allocated memory block
     // created using the size returned by GetDataSize()
 
     // if pData is NULL, or there are no files, return
     if ( !pData || m_filenames.GetCount() == 0 )
-        return FALSE;
+        return false;
 
     // convert data pointer to a DROPFILES struct pointer
     LPDROPFILES pDrop = (LPDROPFILES) pData;
@@ -1068,7 +1081,7 @@ bool wxFileDataObject::GetDataHere(void *pData) const
     {
         // copy filename to pbuf and add null terminator
         size_t len = m_filenames[i].Len();
-        memcpy(pbuf, m_filenames[i], len);
+        memcpy(pbuf, m_filenames[i], len*sizeof(wxChar));
         pbuf += len;
         *pbuf++ = wxT('\0');
     }
@@ -1076,7 +1089,10 @@ bool wxFileDataObject::GetDataHere(void *pData) const
     // add final null terminator
     *pbuf = wxT('\0');
 
-    return TRUE;
+    return true;
+#else
+    return false;
+#endif
 }
 
 // ----------------------------------------------------------------------------
@@ -1118,9 +1134,14 @@ protected:
         memcpy( buffer, unicode_buffer.c_str(),
                 ( unicode_buffer.length() + 1 ) * sizeof(wxChar) );
 
-        return TRUE;
+        return true;
     }
+    virtual bool GetDataHere(const wxDataFormat& WXUNUSED(format),
+                             void *buf) const
+        { return GetDataHere(buf); }
 #endif
+
+    DECLARE_NO_COPY_CLASS(CFSTR_SHELLURLDataObject)
 };
 
 
@@ -1156,8 +1177,7 @@ wxString wxURLDataObject::GetURL() const
 
     size_t len = m_dataObjectLast->GetDataSize();
 
-    m_dataObjectLast->GetDataHere(url.GetWriteBuf(len));
-    url.UngetWriteBuf();
+    m_dataObjectLast->GetDataHere(wxStringBuffer(url, len));
 
     return url;
 }
@@ -1199,10 +1219,13 @@ static const wxChar *GetTymedName(DWORD tymed)
 #endif // Debug
 
 #else // not using OLE at all
+
 // ----------------------------------------------------------------------------
 // wxDataObject
 // ----------------------------------------------------------------------------
 
+#if wxUSE_DATAOBJ
+
 wxDataObject::wxDataObject()
 {
 }
@@ -1216,11 +1239,14 @@ void wxDataObject::SetAutoDelete()
 }
 
 #ifdef __WXDEBUG__
-const wxChar *wxDataObject::GetFormatName(wxDataFormat format)
+const wxChar *wxDataObject::GetFormatName(wxDataFormat WXUNUSED(format))
 {
     return NULL;
 }
-#endif
+#endif // __WXDEBUG__
+
+#endif // wxUSE_DATAOBJ
+
+#endif // wxUSE_OLE/!wxUSE_OLE
 
-#endif