]> git.saurik.com Git - wxWidgets.git/commitdiff
wxTextDataObject now uses Unicode if compiled with wxUSE_UNICODE.
authorMattia Barbon <mbarbon@cpan.org>
Fri, 21 Sep 2001 00:58:32 +0000 (00:58 +0000)
committerMattia Barbon <mbarbon@cpan.org>
Fri, 21 Sep 2001 00:58:32 +0000 (00:58 +0000)
Fixed wxURLDataObject in MSW.
Added GetSizeFromBuffer, SetSizeInBuffer, GetBufferOffset to wxDataObject
 as per Vadim's suggestion.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11659 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dataobj.h
include/wx/msw/ole/dataobj.h
src/common/dobjcmn.cpp
src/msw/ole/dataobj.cpp

index 490016575d903dd89fbb21da48bf6bcf642178c4..19563d31a4fe19c401986ad02ee4df4ac6567851 100644 (file)
@@ -273,6 +273,13 @@ public:
 protected:
     // returns the pointer to the object which supports this format or NULL
     wxDataObjectSimple *GetObject(const wxDataFormat& format) const;
 protected:
     // returns the pointer to the object which supports this format or NULL
     wxDataObjectSimple *GetObject(const wxDataFormat& format) const;
+#if defined(__WXMSW__)
+    virtual const void* GetSizeFromBuffer( const void* buffer, size_t* size,
+                                           const wxDataFormat& format );
+    virtual void* SetSizeInBuffer( void* buffer, size_t size,
+                                   const wxDataFormat& format );
+    virtual size_t GetBufferOffset( const wxDataFormat& format );
+#endif
 
 private:
     // the list of all (simple) data objects whose formats we support
 
 private:
     // the list of all (simple) data objects whose formats we support
@@ -301,7 +308,8 @@ public:
     // ctor: you can specify the text here or in SetText(), or override
     // GetText()
     wxTextDataObject(const wxString& text = wxEmptyString)
     // ctor: you can specify the text here or in SetText(), or override
     // GetText()
     wxTextDataObject(const wxString& text = wxEmptyString)
-        : wxDataObjectSimple(wxDF_TEXT), m_text(text)
+        : wxDataObjectSimple(wxUSE_UNICODE?wxDF_UNICODETEXT:wxDF_TEXT),
+          m_text(text)
         {
         }
 
         {
         }
 
index 9c036b330d24a5dd0ae39469106cfff7e3816350..8f8fb8f2354c6f4a8540f7527959c028adb75bb3 100644 (file)
@@ -48,7 +48,14 @@ public:
 #else // !Debug
     #define wxGetFormatName(format) _T("")
 #endif // Debug/!Debug
 #else // !Debug
     #define wxGetFormatName(format) _T("")
 #endif // Debug/!Debug
-
+    // they need to be accessed from wxIDataObject, so made them public,
+    // or wxIDataObject friend
+public:
+    virtual const void* GetSizeFromBuffer( const void* buffer, size_t* size,
+                                           const wxDataFormat& format );
+    virtual void* SetSizeInBuffer( void* buffer, size_t size,
+                                   const wxDataFormat& format );
+    virtual size_t GetBufferOffset( const wxDataFormat& format );
 private:
     IDataObject *m_pIDataObject; // pointer to the COM interface
 };
 private:
     IDataObject *m_pIDataObject; // pointer to the COM interface
 };
index 868b9c2a58f7af455f82f11a456d1790cc8471ac..d2d6a4e5b72fdcb299d76f06a0b6ab56ae169a89 100644 (file)
@@ -133,6 +133,43 @@ wxDataObjectComposite::GetPreferredFormat(Direction WXUNUSED(dir)) const
     return dataObj->GetFormat();
 }
 
     return dataObj->GetFormat();
 }
 
+#if defined(__WXMSW__)
+
+size_t wxDataObjectComposite::GetBufferOffset( const wxDataFormat& format )
+{
+    wxDataObjectSimple *dataObj = GetObject(format);
+
+    wxCHECK_MSG( dataObj, FALSE,
+                 wxT("unsupported format in wxDataObjectComposite"));
+
+    return dataObj->GetBufferOffset( format );
+}
+
+const void* wxDataObjectComposite::GetSizeFromBuffer( const void* buffer,
+                                                      size_t* size,
+                                                      const wxDataFormat& format )
+{
+    wxDataObjectSimple *dataObj = GetObject(format);
+
+    wxCHECK_MSG( dataObj, FALSE,
+                 wxT("unsupported format in wxDataObjectComposite"));
+
+    return dataObj->GetSizeFromBuffer( buffer, size, format );
+}
+
+void* wxDataObjectComposite::SetSizeInBuffer( void* buffer, size_t size,
+                                              const wxDataFormat& format )
+{
+    wxDataObjectSimple *dataObj = GetObject(format);
+
+    wxCHECK_MSG( dataObj, FALSE,
+                 wxT("unsupported format in wxDataObjectComposite"));
+
+    return dataObj->SetSizeInBuffer( buffer, size, format );
+}
+
+#endif
+
 size_t wxDataObjectComposite::GetFormatCount(Direction WXUNUSED(dir)) const
 {
     // TODO what about the Get/Set only formats?
 size_t wxDataObjectComposite::GetFormatCount(Direction WXUNUSED(dir)) const
 {
     // TODO what about the Get/Set only formats?
@@ -190,19 +227,19 @@ bool wxDataObjectComposite::SetData(const wxDataFormat& format,
 
 size_t wxTextDataObject::GetDataSize() const
 {
 
 size_t wxTextDataObject::GetDataSize() const
 {
-    return GetTextLength();
+    return GetTextLength() * sizeof(wxChar);
 }
 
 bool wxTextDataObject::GetDataHere(void *buf) const
 {
 }
 
 bool wxTextDataObject::GetDataHere(void *buf) const
 {
-    strcpy((char *)buf, GetText().mb_str());
+    wxStrcpy((wxChar *)buf, GetText().c_str());
 
     return TRUE;
 }
 
 bool wxTextDataObject::SetData(size_t WXUNUSED(len), const void *buf)
 {
 
     return TRUE;
 }
 
 bool wxTextDataObject::SetData(size_t WXUNUSED(len), const void *buf)
 {
-    SetText(wxString((const char *)buf));
+    SetText(wxString((const wxChar *)buf));
 
     return TRUE;
 }
 
     return TRUE;
 }
index d27cd12afe70c480ec39a3ea38e8f8f2ffce5fbd..b8993a12c4f19b367c2a39d6c65d46c20aea76cf 100644 (file)
@@ -59,7 +59,6 @@
 #define CFSTR_SHELLURL _T("UniformResourceLocator")
 #endif
 
 #define CFSTR_SHELLURL _T("UniformResourceLocator")
 #endif
 
-
 // ----------------------------------------------------------------------------
 // functions
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // functions
 // ----------------------------------------------------------------------------
@@ -329,7 +328,9 @@ STDMETHODIMP wxIDataObject::GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium)
             if ( !format.IsStandard() ) {
                 // for custom formats, put the size with the data - alloc the
                 // space for it
             if ( !format.IsStandard() ) {
                 // for custom formats, put the size with the data - alloc the
                 // space for it
-                size += sizeof(size_t);
+                // MB: not completely sure this is correct,
+                //     even if I can't figure out what's wrong
+                size += m_pDataObject->GetBufferOffset( format );
             }
 
             HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, size);
             }
 
             HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, size);
@@ -391,14 +392,12 @@ STDMETHODIMP wxIDataObject::GetDataHere(FORMATETC *pformatetc,
                     return E_OUTOFMEMORY;
                 }
 
                     return E_OUTOFMEMORY;
                 }
 
-                if ( !wxDataFormat(pformatetc->cfFormat).IsStandard() ) {
+                wxDataFormat format = pformatetc->cfFormat;
+                if ( !format.IsStandard() ) {
                     // for custom formats, put the size with the data
                     // for custom formats, put the size with the data
-                    size_t *p = (size_t *)pBuf;
-                    *p++ = GlobalSize(hGlobal);
-                    pBuf = p;
+                    pBuf = m_pDataObject->SetSizeInBuffer( pBuf, GlobalSize(hGlobal), format );
                 }
 
                 }
 
-                wxDataFormat format = pformatetc->cfFormat;
                 if ( !m_pDataObject->GetDataHere(format, pBuf) )
                     return E_UNEXPECTED;
 
                 if ( !m_pDataObject->GetDataHere(format, pBuf) )
                     return E_UNEXPECTED;
 
@@ -448,7 +447,7 @@ STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc,
                 }
 
                 // copy data
                 }
 
                 // copy data
-                void *pBuf = GlobalLock(pmedium->hGlobal);
+                const void *pBuf = GlobalLock(pmedium->hGlobal);
                 if ( pBuf == NULL ) {
                     wxLogLastError(wxT("GlobalLock"));
 
                 if ( pBuf == NULL ) {
                     wxLogLastError(wxT("GlobalLock"));
 
@@ -470,9 +469,9 @@ STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc,
 #if !defined(__WATCOMC__) && ! (defined(__BORLANDC__) && (__BORLANDC__ < 0x500))
                     case CF_UNICODETEXT:
 #if (defined(__BORLANDC__) && (__BORLANDC__ > 0x530))
 #if !defined(__WATCOMC__) && ! (defined(__BORLANDC__) && (__BORLANDC__ < 0x500))
                     case CF_UNICODETEXT:
 #if (defined(__BORLANDC__) && (__BORLANDC__ > 0x530))
-                        size = std::wcslen((const wchar_t *)pBuf);
+                        size = std::wcslen((const wchar_t *)pBuf) * sizeof(wchar_t);
 #else
 #else
-                        size = ::wcslen((const wchar_t *)pBuf);
+                        size = ::wcslen((const wchar_t *)pBuf) * sizeof(wchar_t);
 #endif
                         break;
 #endif
 #endif
                         break;
 #endif
@@ -496,12 +495,10 @@ STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc,
                     default:
                         {
                             // we suppose that the size precedes the data
                     default:
                         {
                             // we suppose that the size precedes the data
-                            size_t *p = (size_t *)pBuf;
-                            size = *p++;
-                            pBuf = p;
+                            pBuf = m_pDataObject->GetSizeFromBuffer( pBuf, &size, format );
                             if (! format.IsStandard() ) {
                                 // see GetData for coresponding increment
                             if (! format.IsStandard() ) {
                                 // see GetData for coresponding increment
-                                size -= sizeof(size_t);
+                                size -= m_pDataObject->GetBufferOffset( format  );
                             }
                         }
                 }
                             }
                         }
                 }
@@ -687,6 +684,29 @@ void wxDataObject::SetAutoDelete()
     m_pIDataObject = NULL;
 }
 
     m_pIDataObject = NULL;
 }
 
+size_t wxDataObject::GetBufferOffset( const wxDataFormat& format )
+{
+    return sizeof(size_t);
+}
+
+const void* wxDataObject::GetSizeFromBuffer( const void* buffer, size_t* size,
+                                             const wxDataFormat& format )
+{
+    size_t* p = (size_t*)buffer;
+    *size = *p;
+
+    return p + 1;
+}
+
+void* wxDataObject::SetSizeInBuffer( void* buffer, size_t size,
+                                       const wxDataFormat& format )
+{
+    size_t* p = (size_t*)buffer;
+    *p = size;
+
+    return p + 1;
+}
+
 #ifdef __WXDEBUG__
 
 const wxChar *wxDataObject::GetFormatName(wxDataFormat format)
 #ifdef __WXDEBUG__
 
 const wxChar *wxDataObject::GetFormatName(wxDataFormat format)
@@ -1044,12 +1064,51 @@ bool wxFileDataObject::GetDataHere(void *pData) const
 // wxURLDataObject
 // ----------------------------------------------------------------------------
 
 // wxURLDataObject
 // ----------------------------------------------------------------------------
 
+class CFSTR_SHELLURLDataObject:public wxCustomDataObject
+{
+public:
+    CFSTR_SHELLURLDataObject() : wxCustomDataObject(CFSTR_SHELLURL) {}
+protected:
+    virtual size_t GetBufferOffset( const wxDataFormat& format )
+    {
+        return 0;
+    }
+
+    virtual const void* GetSizeFromBuffer( const void* buffer, size_t* size,
+                                           const wxDataFormat& format )
+    {
+        // CFSTR_SHELLURL is _always_ ANSI text
+        *size = strlen( (const char*)buffer );
+
+        return buffer;
+    }
+
+    virtual void* SetSizeInBuffer( void* buffer, size_t size,
+                                   const wxDataFormat& format )
+    {
+        return buffer;
+    }
+#if wxUSE_UNICODE
+    virtual bool GetDataHere( void* buffer ) const
+    {
+        // CFSTR_SHELLURL is _always_ ANSI!
+        wxCharBuffer char_buffer( GetDataSize() );
+        wxCustomDataObject::GetDataHere( (void*)char_buffer.data() );
+        wxString unicode_buffer( char_buffer );
+        memcpy( buffer, unicode_buffer.c_str(),
+                ( unicode_buffer.length() + 1 ) * sizeof(wxChar) );
+
+        return TRUE;
+    }
+#endif
+};
+
 wxURLDataObject::wxURLDataObject()
 {
     // we support CF_TEXT and CFSTR_SHELLURL formats which are basicly the same
 wxURLDataObject::wxURLDataObject()
 {
     // we support CF_TEXT and CFSTR_SHELLURL formats which are basicly the same
-    // but it seems that some browsers only providene of them so we have to
+    // but it seems that some browsers only provide one of them so we have to
     // support both
     // support both
-    Add(new wxCustomDataObject(CFSTR_SHELLURL));
+    Add(new CFSTR_SHELLURLDataObject());
     Add(new wxTextDataObject);
 
     // we don't have any data yet
     Add(new wxTextDataObject);
 
     // we don't have any data yet