X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/24aab8e81a8627802e4111d9c99a50ece8d0026e..cb3a0d420a58658bffb26e9d7430f292c2d639d6:/src/msw/ole/dataobj.cpp diff --git a/src/msw/ole/dataobj.cpp b/src/msw/ole/dataobj.cpp index 50eea047b9..d4ec164a93 100644 --- a/src/msw/ole/dataobj.cpp +++ b/src/msw/ole/dataobj.cpp @@ -27,6 +27,7 @@ #ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/log.h" + #include "wx/utils.h" #endif #include "wx/dataobj.h" @@ -1047,22 +1048,44 @@ 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 + // 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 // if no filenames in list, size is 0 - if ( m_filenames.GetCount() == 0 ) + if ( m_filenames.empty() ) return 0; +#if wxUSE_UNICODE_MSLU + size_t sizeOfChar; + if ( wxGetOsVersion() == wxOS_WINDOWS_9X ) + { + // Win9x always uses ANSI file names and MSLU doesn't help with this + sizeOfChar = sizeof(char); + } + else + { + sizeOfChar = sizeof(wxChar); + } +#else // !wxUSE_UNICODE_MSLU + static const size_t sizeOfChar = sizeof(wxChar); +#endif // wxUSE_UNICODE_MSLU/!wxUSE_UNICODE_MSLU + // inital size of DROPFILES struct + null byte - size_t sz = sizeof(DROPFILES) + (1 * sizeof(wxChar)); + size_t sz = sizeof(DROPFILES) + sizeOfChar; - size_t count = m_filenames.GetCount(); + const size_t count = m_filenames.size(); for ( size_t i = 0; i < count; i++ ) { // add filename length plus null byte - sz += (m_filenames[i].Len() + 1) * sizeof(wxChar); + size_t len; +#if wxUSE_UNICODE_MSLU + if ( sizeOfChar == sizeof(char) ) + len = strlen(wxConvFileName->cWC2MB(m_filenames[i])); + else +#endif // wxUSE_UNICODE_MSLU + len = m_filenames[i].length(); + + sz += (len + 1) * sizeOfChar; } return sz; @@ -1078,7 +1101,7 @@ bool wxFileDataObject::GetDataHere(void *WXUNUSED_IN_WINCE(pData)) const // created using the size returned by GetDataSize() // if pData is NULL, or there are no files, return - if ( !pData || m_filenames.GetCount() == 0 ) + if ( !pData || m_filenames.empty() ) return false; // convert data pointer to a DROPFILES struct pointer @@ -1087,27 +1110,44 @@ bool wxFileDataObject::GetDataHere(void *WXUNUSED_IN_WINCE(pData)) const // initialize DROPFILES struct pDrop->pFiles = sizeof(DROPFILES); pDrop->fNC = FALSE; // not non-client coords -#if wxUSE_UNICODE - pDrop->fWide = TRUE; -#else // ANSI - pDrop->fWide = FALSE; -#endif // Unicode/Ansi +#if wxUSE_UNICODE_MSLU + pDrop->fWide = wxGetOsVersion() != wxOS_WINDOWS_9X ? TRUE : FALSE; +#else + pDrop->fWide = wxUSE_UNICODE; +#endif + + const size_t sizeOfChar = pDrop->fWide ? sizeof(wchar_t) : sizeof(char); // set start of filenames list (null separated) - wxChar *pbuf = (wxChar*) ((BYTE *)pDrop + sizeof(DROPFILES)); + BYTE *pbuf = (BYTE *)(pDrop + 1); - size_t count = m_filenames.GetCount(); - for (size_t i = 0; i < count; i++ ) + const size_t count = m_filenames.size(); + for ( size_t i = 0; i < count; i++ ) { // copy filename to pbuf and add null terminator - size_t len = m_filenames[i].Len(); - memcpy(pbuf, m_filenames[i], len*sizeof(wxChar)); - pbuf += len; - *pbuf++ = wxT('\0'); + size_t len; +#if wxUSE_UNICODE_MSLU + if ( sizeOfChar == sizeof(char) ) + { + wxCharBuffer buf(wxConvFileName->cWC2MB(m_filenames[i])); + len = strlen(buf); + memcpy(pbuf, buf, len*sizeOfChar); + } + else +#endif // wxUSE_UNICODE_MSLU + { + len = m_filenames[i].length(); + memcpy(pbuf, m_filenames[i].c_str(), len*sizeOfChar); + } + + pbuf += len*sizeOfChar; + + memset(pbuf, 0, sizeOfChar); + pbuf += sizeOfChar; } // add final null terminator - *pbuf = wxT('\0'); + memset(pbuf, 0, sizeOfChar); return true; #else @@ -1119,6 +1159,12 @@ bool wxFileDataObject::GetDataHere(void *WXUNUSED_IN_WINCE(pData)) const // wxURLDataObject // ---------------------------------------------------------------------------- +// Work around bug in Wine headers +#if defined(__WINE__) && defined(CFSTR_SHELLURL) && wxUSE_UNICODE +#undef CFSTR_SHELLURL +#define CFSTR_SHELLURL _T("CFSTR_SHELLURL") +#endif + class CFSTR_SHELLURLDataObject : public wxCustomDataObject { public: