Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
/***************************************************************************
 *         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;
}