bool CIDataObject::GetData ( const wxDataFormat& rFormat, char* pzBuffer, ULONG ulLen ) { QueryGetData(rFormat); if (rFormat.GetType() == wxDF_INVALID) return false; ULONG ulSize = m_pDataObject->GetDataSize(rFormat); if (ulSize == 0) { // // It probably means that the method is just not implemented // return false; } if (rFormat.GetType() == wxDF_PRIVATE) { // // For custom formats, put the size with the data - alloc the // space for it // ulSize += sizeof(ULONG); } if (ulSize > ulLen) // not enough room to copy return false; // // Copy the data // GetDataHere( rFormat ,pzBuffer ,ulSize ); return true; } // end of CIDataObject::GetData
bool wxClipboard::GetData( wxDataObject& data ) { wxCHECK_MSG( m_open, false, wxT("clipboard not open") ); /* get formats from wxDataObjects */ wxDataFormat *array = new wxDataFormat[ data.GetFormatCount() ]; data.GetAllFormats( array ); for (size_t i = 0; i < data.GetFormatCount(); i++) { wxDataFormat format( array[i] ); wxLogTrace( TRACE_CLIPBOARD, wxT("wxClipboard::GetData: requested format: %s"), format.GetId().c_str() ); /* is data supported by clipboard ? */ /* store requested format to be asked for by callbacks */ m_targetRequested = format; wxCHECK_MSG( m_targetRequested, false, wxT("invalid clipboard format") ); m_formatSupported = false; /* perform query. this will set m_formatSupported to true if m_targetRequested is supported. also, we have to wait for the "answer" from the clipboard owner which is an asynchronous process. therefore we set m_waiting = true here and wait until the callback "targets_selection_received" sets it to false */ m_waiting = true; gtk_selection_convert( m_targetsWidget, m_usePrimary ? (GdkAtom)GDK_SELECTION_PRIMARY : g_clipboardAtom, g_targetsAtom, (guint32) GDK_CURRENT_TIME ); while (m_waiting) gtk_main_iteration(); if (!m_formatSupported) continue; /* store pointer to data object to be filled up by callbacks */ m_receivedData = &data; /* store requested format to be asked for by callbacks */ m_targetRequested = format; wxCHECK_MSG( m_targetRequested, false, wxT("invalid clipboard format") ); /* start query */ m_formatSupported = false; /* ask for clipboard contents. this will set m_formatSupported to true if m_targetRequested is supported. also, we have to wait for the "answer" from the clipboard owner which is an asynchronous process. therefore we set m_waiting = true here and wait until the callback "targets_selection_received" sets it to false */ m_waiting = true; wxLogTrace( TRACE_CLIPBOARD, wxT("wxClipboard::GetData: format found, start convert") ); gtk_selection_convert( m_clipboardWidget, m_usePrimary ? (GdkAtom)GDK_SELECTION_PRIMARY : g_clipboardAtom, m_targetRequested, (guint32) GDK_CURRENT_TIME ); while (m_waiting) gtk_main_iteration(); /* Normally this is a true error as we checked for the presence of such data before, but there are applications that may return an empty string (e.g. Gnumeric-1.6.1 on Linux if an empty cell is copied) which would produce a false error message here, so we check for the size of the string first. In ansi, GetDataSize returns an extra value (for the closing null?), with unicode, the exact number of tokens is given (that is more than 1 for special characters) (tested with Gnumeric-1.6.1 and OpenOffice.org-2.0.2) */ #if wxUSE_UNICODE if ( format != wxDF_UNICODETEXT || data.GetDataSize(format) > 0 ) #else // !UNICODE if ( format != wxDF_TEXT || data.GetDataSize(format) > 1 ) #endif // UNICODE / !UNICODE { wxCHECK_MSG( m_formatSupported, false, wxT("error retrieving data from clipboard") ); } /* return success */ delete[] array; return true; } wxLogTrace( TRACE_CLIPBOARD, wxT("wxClipboard::GetData: format not found") ); /* return failure */ delete[] array; return false; }
bool wxClipboard::GetData( wxDataObject& data ) { wxCHECK_MSG( m_open, false, wxT("clipboard not open") ); // get all supported formats from wxDataObjects: notice that we are setting // the object data, so we need them in "Set" direction const size_t count = data.GetFormatCount(wxDataObject::Set); wxDataFormatArray formats(new wxDataFormat[count]); data.GetAllFormats(formats.get(), wxDataObject::Set); for ( size_t i = 0; i < count; i++ ) { const wxDataFormat format(formats[i]); // is this format supported by clipboard ? if ( !DoIsSupported(format) ) continue; wxLogTrace(TRACE_CLIPBOARD, wxT("Requesting format %s"), format.GetId().c_str()); // these variables will be used by our GTKOnSelectionReceived() m_receivedData = &data; m_formatSupported = false; { wxClipboardSync sync(*this); gtk_selection_convert(m_clipboardWidget, GTKGetClipboardAtom(), format, (guint32) GDK_CURRENT_TIME ); } // wait until we get the results /* Normally this is a true error as we checked for the presence of such data before, but there are applications that may return an empty string (e.g. Gnumeric-1.6.1 on Linux if an empty cell is copied) which would produce a false error message here, so we check for the size of the string first. With ANSI, GetDataSize returns an extra value (for the closing null?), with unicode, the exact number of tokens is given (that is more than 1 for non-ASCII characters) (tested with Gnumeric-1.6.1 and OpenOffice.org-2.0.2) */ #if wxUSE_UNICODE if ( format != wxDF_UNICODETEXT || data.GetDataSize(format) > 0 ) #else // !UNICODE if ( format != wxDF_TEXT || data.GetDataSize(format) > 1 ) #endif // UNICODE / !UNICODE { wxCHECK_MSG( m_formatSupported, false, wxT("error retrieving data from clipboard") ); } return true; } wxLogTrace(TRACE_CLIPBOARD, wxT("GetData(): format not found")); return false; }
// get data functions STDMETHODIMP wxIDataObject::GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium) { wxLogTrace(wxTRACE_OleCalls, wxT("wxIDataObject::GetData")); // is data is in our format? HRESULT hr = QueryGetData(pformatetcIn); if ( FAILED(hr) ) return hr; // for the bitmaps and metafiles we use the handles instead of global memory // to pass the data wxDataFormat format = (wxDataFormat::NativeFormat)pformatetcIn->cfFormat; format = HtmlFormatFixup(format); // is this system data? if ( GetSystemData(format, pmedium) ) { // pmedium is already filled with corresponding data, so we're ready. return S_OK; } switch ( format ) { case wxDF_BITMAP: pmedium->tymed = TYMED_GDI; break; case wxDF_ENHMETAFILE: pmedium->tymed = TYMED_ENHMF; break; #ifndef __WXWINCE__ case wxDF_METAFILE: pmedium->hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, sizeof(METAFILEPICT)); if ( !pmedium->hGlobal ) { wxLogLastError(wxT("GlobalAlloc")); return E_OUTOFMEMORY; } pmedium->tymed = TYMED_MFPICT; break; #endif default: // alloc memory size_t size = m_pDataObject->GetDataSize(format); if ( !size ) { // it probably means that the method is just not implemented wxLogDebug(wxT("Invalid data size - can't be 0")); return DV_E_FORMATETC; } // we may need extra space for the buffer size size += m_pDataObject->GetBufferOffset( format ); HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, size); if ( hGlobal == NULL ) { wxLogLastError(wxT("GlobalAlloc")); return E_OUTOFMEMORY; } // copy data pmedium->tymed = TYMED_HGLOBAL; pmedium->hGlobal = hGlobal; } pmedium->pUnkForRelease = NULL; // do copy the data hr = GetDataHere(pformatetcIn, pmedium); if ( FAILED(hr) ) { // free resources we allocated if ( pmedium->tymed & (TYMED_HGLOBAL | TYMED_MFPICT) ) { GlobalFree(pmedium->hGlobal); } return hr; } return S_OK; }