static HRESULT STDMETHODCALLTYPE CDevSettings_GetCanonicalFormatEtc(IDataObject* iface, FORMATETC* pformatectIn, FORMATETC* pformatetcOut) { HRESULT hr; DPRINT1("CDevSettings::GetCanonicalFormatEtc\n"); hr = IDataObject_QueryGetData(iface, pformatectIn); if (SUCCEEDED(hr)) { CopyMemory(pformatetcOut, pformatectIn, sizeof(FORMATETC)); /* Make sure the data is target device independent */ if (pformatectIn->ptd == NULL) hr = DATA_S_SAMEFORMATETC; else { pformatetcOut->ptd = NULL; hr = S_OK; } } else { ZeroMemory(pformatetcOut, sizeof(FORMATETC)); } return hr; }
static DWORD init_linklist(HWND hdlg, OLEUIPASTESPECIALW *ps) { HRESULT hr; DWORD supported_mask = 0; DWORD items_added = 0; int link, req_fmt; FORMATETC fmt = {0, NULL, DVASPECT_CONTENT, -1, -1}; for(link = 0; link < ps->cLinkTypes && link < PS_MAXLINKTYPES; link++) { fmt.cfFormat = ps->arrLinkTypes[link]; hr = IDataObject_QueryGetData(ps->lpSrcDataObj, &fmt); if(hr == S_OK) supported_mask |= 1 << link; } TRACE("supported_mask %02x\n", supported_mask); for(req_fmt = 0; req_fmt < ps->cPasteEntries; req_fmt++) { DWORD linktypes; if(ps->arrPasteEntries[req_fmt].dwFlags & OLEUIPASTE_LINKANYTYPE) linktypes = 0xff; else linktypes = ps->arrPasteEntries[req_fmt].dwFlags & 0xff; if(linktypes & supported_mask) { add_entry_to_lb(hdlg, IDC_PS_PASTELINKLIST, ps->arrPasteEntries + req_fmt); items_added++; } } EnableWindow(GetDlgItem(hdlg, IDC_PS_PASTELINK), items_added ? TRUE : FALSE); return items_added; }
static HRESULT STDMETHODCALLTYPE CDevSettings_GetData(IDataObject* iface, FORMATETC* pformatetcIn, STGMEDIUM* pmedium) { static const WCHAR szEmpty[] = {0}; HRESULT hr; PCWSTR pszRet = NULL; PWSTR pszBuf; PCDevSettings This = impl_from_IDataObject(iface); ZeroMemory(pmedium, sizeof(STGMEDIUM)); hr = IDataObject_QueryGetData(iface, pformatetcIn); if (SUCCEEDED(hr)) { /* Return the reqested data back to the shell extension */ if (pformatetcIn->cfFormat == This->cfDisplayDevice) { pszRet = This->pDisplayDevice; DPRINT1("CDevSettings::GetData returns display device %ws\n", pszRet); } else if (pformatetcIn->cfFormat == This->cfDisplayName) { pszRet = This->pDisplayName; DPRINT1("CDevSettings::GetData returns display name %ws\n", pszRet); } else if (pformatetcIn->cfFormat == This->cfDisplayKey) { pszRet = This->pDisplayKey; DPRINT1("CDevSettings::GetData returns display key %ws\n", pszRet); } else if (pformatetcIn->cfFormat == This->cfDisplayId) { pszRet = This->pDisplayId; DPRINT1("CDevSettings::GetData returns display id %ws\n", pszRet); } else if (pformatetcIn->cfFormat == This->cfMonitorName) { pszRet = This->pMonitorName; DPRINT1("CDevSettings::GetData returns monitor name %ws\n", pszRet); } else if (pformatetcIn->cfFormat == This->cfMonitorDevice) { pszRet = This->pMonitorDevice; DPRINT1("CDevSettings::GetData returns monitor device %ws\n", pszRet); } else if (pformatetcIn->cfFormat == This->cfExtInterface) { PDESK_EXT_INTERFACE pIface; pIface = GlobalAlloc(GPTR, sizeof(*pIface)); if (pIface != NULL) { CopyMemory(pIface, &This->ExtInterface, sizeof(This->ExtInterface)); DPRINT1("CDevSettings::GetData returns the desk.cpl extension interface\n"); pmedium->tymed = TYMED_HGLOBAL; pmedium->hGlobal = pIface; return S_OK; } else return E_OUTOFMEMORY; } else if (pformatetcIn->cfFormat == This->cfDisplayStateFlags) { PDWORD pdw; pdw = GlobalAlloc(GPTR, sizeof(*pdw)); if (pdw != NULL) { *pdw = This->StateFlags; DPRINT1("CDevSettings::GetData returns the display state flags %x\n", This->StateFlags); pmedium->tymed = TYMED_HGLOBAL; pmedium->hGlobal = pdw; return S_OK; } else return E_OUTOFMEMORY; } else if (pformatetcIn->cfFormat == This->cfPruningMode) { PBYTE pb; pb = GlobalAlloc(GPTR, sizeof(*pb)); if (pb != NULL) { *pb = (This->bModesPruned && This->bPruningOn); pmedium->tymed = TYMED_HGLOBAL; pmedium->hGlobal = pb; return S_OK; } else return E_OUTOFMEMORY; } /* NOTE: This only returns null-terminated strings! */ if (pszRet == NULL) pszRet = szEmpty; pszBuf = GlobalAlloc(GPTR, (wcslen(pszRet) + 1) * sizeof(WCHAR)); if (pszBuf != NULL) { hr = StringCbCopy(pszBuf, (wcslen(pszRet) + 1) * sizeof(WCHAR), pszRet); if (FAILED(hr)) { GlobalFree(pszBuf); return hr; } pmedium->tymed = TYMED_HGLOBAL; pmedium->hGlobal = pszBuf; hr = S_OK; } else hr = E_OUTOFMEMORY; } return hr; }
/*************************************************************************** * get_storage * * Retrieve an object's storage from a variety of sources. * * FIXME: CF_FILENAME. */ static HRESULT get_storage(IDataObject *data, IStorage *stg, UINT *src_cf) { static const UINT fmt_id[] = { CF_METAFILEPICT, CF_BITMAP, CF_DIB }; UINT i; HRESULT hr; FORMATETC fmt; STGMEDIUM med; IPersistStorage *persist; CLSID clsid; *src_cf = 0; /* CF_EMBEDEDOBJECT */ init_fmtetc(&fmt, embedded_object_clipboard_format, TYMED_ISTORAGE); med.tymed = TYMED_ISTORAGE; med.u.pstg = stg; hr = IDataObject_GetDataHere(data, &fmt, &med); if(SUCCEEDED(hr)) { *src_cf = embedded_object_clipboard_format; return hr; } /* CF_EMBEDSOURCE */ init_fmtetc(&fmt, embed_source_clipboard_format, TYMED_ISTORAGE); med.tymed = TYMED_ISTORAGE; med.u.pstg = stg; hr = IDataObject_GetDataHere(data, &fmt, &med); if(SUCCEEDED(hr)) { *src_cf = embed_source_clipboard_format; return hr; } for (i = 0; i < sizeof(fmt_id)/sizeof(fmt_id[0]); i++) { init_fmtetc(&fmt, fmt_id[i], TYMED_ISTORAGE); hr = IDataObject_QueryGetData(data, &fmt); if(SUCCEEDED(hr)) { *src_cf = fmt_id[i]; return hr; } } /* IPersistStorage */ hr = IDataObject_QueryInterface(data, &IID_IPersistStorage, (void**)&persist); if(FAILED(hr)) return hr; hr = IPersistStorage_GetClassID(persist, &clsid); if(FAILED(hr)) goto end; hr = IStorage_SetClass(stg, &clsid); if(FAILED(hr)) goto end; hr = IPersistStorage_Save(persist, stg, FALSE); if(FAILED(hr)) goto end; hr = IPersistStorage_SaveCompleted(persist, NULL); end: IPersistStorage_Release(persist); return hr; }