nsresult Do_CheckOneFile() { nsresult rv; nsCOMPtr<nsITransferable> transferable; nsCOMPtr<nsISupportsArray> transferableArray; nsCOMPtr<nsISupports> genericWrapper; nsRefPtr<IDataObject> dataObj; rv = NS_NewISupportsArray(getter_AddRefs(transferableArray)); if (NS_FAILED(rv)) { fail("Could not create the necessary nsISupportsArray"); return rv; } rv = GetTransferableFile(transferable); if (NS_FAILED(rv)) { fail("Could not create the proper nsITransferable!"); return rv; } genericWrapper = do_QueryInterface(transferable); rv = transferableArray->AppendElement(genericWrapper); if (NS_FAILED(rv)) { fail("Could not append element to transferable array"); return rv; } rv = MakeDataObject(transferableArray, dataObj); if (NS_FAILED(rv)) { fail("Could not create data object"); return rv; } FORMATETC fe; SET_FORMATETC(fe, CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL); if (dataObj->QueryGetData(&fe) != S_OK) { fail("File data object does not support the file data type!"); return NS_ERROR_UNEXPECTED; } STGMEDIUM* stg; stg = (STGMEDIUM*)CoTaskMemAlloc(sizeof(STGMEDIUM)); if (dataObj->GetData(&fe, stg) != S_OK) { fail("File data object did not provide data on request"); return NS_ERROR_UNEXPECTED; } rv = CheckValidHDROP(stg); if (NS_FAILED(rv)) { fail("HDROP was invalid"); return rv; } ReleaseStgMedium(stg); return NS_OK; }
nsresult Do_CheckSetArbitraryData(bool aMultiple) { nsresult rv; nsCOMPtr<nsITransferable> transferable; nsCOMPtr<nsISupportsArray> transferableArray; nsCOMPtr<nsISupports> genericWrapper; nsRefPtr<IDataObject> dataObj; rv = NS_NewISupportsArray(getter_AddRefs(transferableArray)); if (NS_FAILED(rv)) { fail("Could not create the necessary nsISupportsArray"); return rv; } rv = GetTransferableText(transferable); if (NS_FAILED(rv)) { fail("Could not create the proper nsITransferable!"); return rv; } genericWrapper = do_QueryInterface(transferable); rv = transferableArray->AppendElement(genericWrapper); if (NS_FAILED(rv)) { fail("Could not append element to transferable array"); return rv; } if (aMultiple) { rv = GetTransferableText(transferable); if (NS_FAILED(rv)) { fail("Could not create the proper nsITransferable!"); return rv; } genericWrapper = do_QueryInterface(transferable); rv = transferableArray->AppendElement(genericWrapper); if (NS_FAILED(rv)) { fail("Could not append element to transferable array"); return rv; } } rv = MakeDataObject(transferableArray, dataObj); if (NS_FAILED(rv)) { fail("Could not create data object"); return rv; } static CLIPFORMAT mozArbitraryFormat = ::RegisterClipboardFormatW(L"MozillaTestFormat"); FORMATETC fe; STGMEDIUM stg; SET_FORMATETC(fe, mozArbitraryFormat, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL); HGLOBAL hg = GlobalAlloc(GPTR, 1024); stg.tymed = TYMED_HGLOBAL; stg.hGlobal = hg; stg.pUnkForRelease = nullptr; if (dataObj->SetData(&fe, &stg, true) != S_OK) { if (aMultiple) { fail("Unable to set arbitrary data type on data object collection!"); } else { fail("Unable to set arbitrary data type on data object!"); } return NS_ERROR_UNEXPECTED; } if (dataObj->QueryGetData(&fe) != S_OK) { fail("Arbitrary data set on data object is not advertised!"); return NS_ERROR_UNEXPECTED; } STGMEDIUM* stg2; stg2 = (STGMEDIUM*)CoTaskMemAlloc(sizeof(STGMEDIUM)); if (dataObj->GetData(&fe, stg2) != S_OK) { fail("Data object did not provide arbitrary data upon request!"); return NS_ERROR_UNEXPECTED; } if (stg2->hGlobal != hg) { fail("Arbitrary data was not returned properly!"); return rv; } ReleaseStgMedium(stg2); return NS_OK; }
nsresult Do_CheckTwoStrings() { nsresult rv; nsCOMPtr<nsITransferable> transferable; nsCOMPtr<nsIMutableArray> transferableArray = nsArray::Create(); nsCOMPtr<nsISupports> genericWrapper; RefPtr<IDataObject> dataObj; rv = GetTransferableText(transferable); if (NS_FAILED(rv)) { fail("Could not create the proper nsITransferable!"); return rv; } genericWrapper = do_QueryInterface(transferable); rv = transferableArray->AppendElement(genericWrapper); if (NS_FAILED(rv)) { fail("Could not append element to transferable array"); return rv; } rv = GetTransferableTextTwo(transferable); if (NS_FAILED(rv)) { fail("Could not create the proper nsITransferable!"); return rv; } genericWrapper = do_QueryInterface(transferable); rv = transferableArray->AppendElement(genericWrapper); if (NS_FAILED(rv)) { fail("Could not append element to transferable array"); return rv; } rv = MakeDataObject(transferableArray, dataObj); if (NS_FAILED(rv)) { fail("Could not create data object"); return rv; } FORMATETC fe; SET_FORMATETC(fe, CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL); if (dataObj->QueryGetData(&fe) != S_OK) { fail("String data object does not support the ASCII text data type!"); return NS_ERROR_UNEXPECTED; } STGMEDIUM* stg; stg = (STGMEDIUM*)CoTaskMemAlloc(sizeof(STGMEDIUM)); if (dataObj->GetData(&fe, stg) != S_OK) { fail("String data object did not provide ASCII data on request"); return NS_ERROR_UNEXPECTED; } rv = CheckValidTEXTTwo(stg); if (NS_FAILED(rv)) { fail("TEXT was invalid"); return rv; } ReleaseStgMedium(stg); SET_FORMATETC(fe, CF_UNICODETEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL); if (dataObj->QueryGetData(&fe) != S_OK) { fail("String data object does not support the wide text data type!"); return NS_ERROR_UNEXPECTED; } if (dataObj->GetData(&fe, stg) != S_OK) { fail("String data object did not provide wide data on request"); return NS_ERROR_UNEXPECTED; } rv = CheckValidUNICODETwo(stg); if (NS_FAILED(rv)) { fail("UNICODE was invalid"); return rv; } return NS_OK; }