HRESULT WINAPI OleQueryCreateFromData(IDataObject *data) { IEnumFORMATETC *enum_fmt; FORMATETC fmt; BOOL found_static = FALSE; HRESULT hr; hr = IDataObject_EnumFormatEtc(data, DATADIR_GET, &enum_fmt); if(FAILED(hr)) return hr; do { hr = IEnumFORMATETC_Next(enum_fmt, 1, &fmt, NULL); if(hr == S_OK) { if(fmt.cfFormat == embedded_object_clipboard_format || fmt.cfFormat == embed_source_clipboard_format || fmt.cfFormat == filename_clipboard_format) { IEnumFORMATETC_Release(enum_fmt); return S_OK; } if(fmt.cfFormat == CF_METAFILEPICT || fmt.cfFormat == CF_BITMAP || fmt.cfFormat == CF_DIB) found_static = TRUE; } } while (hr == S_OK); IEnumFORMATETC_Release(enum_fmt); return found_static ? OLE_S_STATIC : S_FALSE; }
static DWORD init_pastelist(HWND hdlg, OLEUIPASTESPECIALW *ps) { IEnumFORMATETC *penum; HRESULT hr; FORMATETC fmts[20]; DWORD fetched, items_added = 0; hr = IDataObject_EnumFormatEtc(ps->lpSrcDataObj, DATADIR_GET, &penum); if(FAILED(hr)) { WARN("Unable to create IEnumFORMATETC\n"); return 0; } /* The native version grabs only the first 20 fmts and we do the same */ hr = IEnumFORMATETC_Next(penum, sizeof(fmts)/sizeof(fmts[0]), fmts, &fetched); TRACE("got %d formats hr %08x\n", fetched, hr); if(SUCCEEDED(hr)) { DWORD src_fmt, req_fmt; for(req_fmt = 0; req_fmt < ps->cPasteEntries; req_fmt++) { /* This is used by update_structure() to set nSelectedIndex on exit */ ps->arrPasteEntries[req_fmt].dwScratchSpace = req_fmt; TRACE("req_fmt %x\n", ps->arrPasteEntries[req_fmt].fmtetc.cfFormat); for(src_fmt = 0; src_fmt < fetched; src_fmt++) { TRACE("\tenum'ed fmt %x\n", fmts[src_fmt].cfFormat); if(ps->arrPasteEntries[req_fmt].fmtetc.cfFormat == fmts[src_fmt].cfFormat) { add_entry_to_lb(hdlg, IDC_PS_PASTELIST, ps->arrPasteEntries + req_fmt); items_added++; break; } } } } IEnumFORMATETC_Release(penum); EnableWindow(GetDlgItem(hdlg, IDC_PS_PASTE), items_added ? TRUE : FALSE); return items_added; }