TEST(iDataObjectTest,Simple) { IDataObject *pDataObject = NULL; CreateDataObject(NULL,NULL,&pDataObject,0); FORMATETC ftc; ftc.cfFormat = CF_TEXT; ftc.dwAspect = DVASPECT_CONTENT; ftc.lindex = -1; ftc.ptd = NULL; ftc.tymed = TYMED_HGLOBAL; EXPECT_EQ(DV_E_FORMATETC,pDataObject->QueryGetData(&ftc)); EXPECT_EQ(E_NOTIMPL,pDataObject->DAdvise(NULL,ADVF_NODATA,NULL,NULL)); EXPECT_EQ(OLE_E_ADVISENOTSUPPORTED,pDataObject->DUnadvise(0)); EXPECT_EQ(OLE_E_ADVISENOTSUPPORTED,pDataObject->EnumDAdvise(NULL)); }
// Other objects querying to see if we support a particular format STDMETHODIMP nsDataObjCollection::QueryGetData(LPFORMATETC pFE) { UINT format = nsClipboard::GetFormat(MULTI_MIME); if (format == pFE->cfFormat) { return S_OK; } for (PRUint32 i = 0; i < mDataObjects.Length(); ++i) { IDataObject * dataObj = mDataObjects.ElementAt(i); if (S_OK == dataObj->QueryGetData(pFE)) { return S_OK; } } return DV_E_FORMATETC; }
// @pymethod |PyIDataObject|QueryGetData|Checks if the objects supports returning data in a particular format. // @rdesc Returns None if the object supports the specified format, otherwise an error is raised. PyObject *PyIDataObject::QueryGetData(PyObject *self, PyObject *args) { IDataObject *pIDO = GetI(self); if ( pIDO == NULL ) return NULL; FORMATETC formatetc; PyObject *obpformatetc; // @pyparm <o PyFORMATETC>|pformatetc||Tuple representing a FORMATETC struct describing how the data should be returned if ( !PyArg_ParseTuple(args, "O:QueryGetData", &obpformatetc) ) return NULL; BOOL bPythonIsHappy = TRUE; if (bPythonIsHappy && !PyObject_AsFORMATETC( obpformatetc, &formatetc )) bPythonIsHappy = FALSE; if (!bPythonIsHappy) return NULL; HRESULT hr; PY_INTERFACE_PRECALL; hr = pIDO->QueryGetData( &formatetc ); PY_INTERFACE_POSTCALL; if ( FAILED(hr) ) return PyCom_BuildPyException(hr, pIDO, IID_IDataObject ); Py_INCREF(Py_None); return Py_None; }
//------------------------------------------------------------------------- NS_IMETHODIMP nsDragService::IsDataFlavorSupported(const char *aDataFlavor, PRBool *_retval) { if (!aDataFlavor || !mDataObject || !_retval) return NS_ERROR_FAILURE; #ifdef NS_DEBUG if (strcmp(aDataFlavor, kTextMime) == 0) NS_WARNING("DO NOT USE THE text/plain DATA FLAVOR ANY MORE. USE text/unicode INSTEAD"); #endif *_retval = PR_FALSE; FORMATETC fe; UINT format = 0; if (IsCollectionObject(mDataObject)) { // We know we have one of our special collection objects. format = nsClipboard::GetFormat(aDataFlavor); SET_FORMATETC(fe, format, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL | TYMED_FILE | TYMED_GDI); // See if any one of the IDataObjects in the collection supports // this data type nsDataObjCollection* dataObjCol = GetDataObjCollection(mDataObject); if (dataObjCol) { PRUint32 cnt = dataObjCol->GetNumDataObjects(); for (PRUint32 i=0;i<cnt;++i) { IDataObject * dataObj = dataObjCol->GetDataObjectAt(i); if (S_OK == dataObj->QueryGetData(&fe)) *_retval = PR_TRUE; // found it! } } } // if special collection object else { // Ok, so we have a single object. Check to see if has the correct // data type. Since this can come from an outside app, we also // need to see if we need to perform text->unicode conversion if // the client asked for unicode and it wasn't available. format = nsClipboard::GetFormat(aDataFlavor); SET_FORMATETC(fe, format, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL | TYMED_FILE | TYMED_GDI); if (mDataObject->QueryGetData(&fe) == S_OK) *_retval = PR_TRUE; // found it! else { // We haven't found the exact flavor the client asked for, but // maybe we can still find it from something else that's on the // clipboard if (strcmp(aDataFlavor, kUnicodeMime) == 0) { // client asked for unicode and it wasn't present, check if we // have CF_TEXT. We'll handle the actual data substitution in // the data object. format = nsClipboard::GetFormat(kTextMime); SET_FORMATETC(fe, format, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL | TYMED_FILE | TYMED_GDI); if (mDataObject->QueryGetData(&fe) == S_OK) *_retval = PR_TRUE; // found it! } else if (strcmp(aDataFlavor, kURLMime) == 0) { // client asked for a url and it wasn't present, but if we // have a file, then we have a URL to give them (the path, or // the internal URL if an InternetShortcut). format = nsClipboard::GetFormat(kFileMime); SET_FORMATETC(fe, format, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL | TYMED_FILE | TYMED_GDI); if (mDataObject->QueryGetData(&fe) == S_OK) *_retval = PR_TRUE; // found it! } } // else try again } return NS_OK; }