mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
262 lines
5.0 KiB
262 lines
5.0 KiB
#include "dataobj.h"
|
|
#include <stdlib.h>
|
|
|
|
CImpIDataObject::CImpIDataObject(
|
|
PCDataObject pObj,
|
|
LPUNKNOWN pUnkOuter
|
|
)
|
|
{
|
|
m_cRef = 0;
|
|
m_pObj = pObj;
|
|
m_pUnkOuter = pUnkOuter;
|
|
return;
|
|
}
|
|
|
|
|
|
CImpIDataObject::~CImpIDataObject(void)
|
|
{
|
|
return;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CImpIDataObject::QueryInterface(
|
|
REFIID riid,
|
|
LPLPVOID ppv
|
|
)
|
|
{
|
|
return m_pUnkOuter->QueryInterface(riid, ppv);
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
CImpIDataObject::AddRef(void)
|
|
{
|
|
++m_cRef;
|
|
return m_pUnkOuter->AddRef();
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
CImpIDataObject::Release(void)
|
|
{
|
|
--m_cRef;
|
|
return m_pUnkOuter->Release();
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CImpIDataObject::GetData(
|
|
LPFORMATETC pFE,
|
|
LPSTGMEDIUM pSTM
|
|
)
|
|
{
|
|
UINT cf = pFE->cfFormat;
|
|
|
|
if (!(DVASPECT_CONTENT & pFE->dwAspect))
|
|
return ResultFromScode(DATA_E_FORMATETC);
|
|
|
|
switch (cf)
|
|
{
|
|
case CF_TEXT:
|
|
if (!(TYMED_HGLOBAL & pFE->tymed))
|
|
break;
|
|
return m_pObj->RenderText(pSTM, TEXT("Getdata"),
|
|
FL_MAKE_ITEM | FL_PASS_PUNK);
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return ResultFromScode(DATA_E_FORMATETC);
|
|
}
|
|
|
|
|
|
|
|
STDMETHODIMP
|
|
CImpIDataObject::GetDataHere(
|
|
LPFORMATETC pFE,
|
|
LPSTGMEDIUM pSTM
|
|
)
|
|
{
|
|
UINT cf = pFE->cfFormat;
|
|
|
|
if (!(DVASPECT_CONTENT & pFE->dwAspect))
|
|
return ResultFromScode(DATA_E_FORMATETC);
|
|
|
|
switch (cf)
|
|
{
|
|
case CF_TEXT:
|
|
if (!(TYMED_HGLOBAL & pFE->tymed))
|
|
break;
|
|
|
|
if(TYMED_NULL == pSTM->tymed)
|
|
return ResultFromScode(S_OK);
|
|
|
|
if(TYMED_HGLOBAL != pSTM->tymed)
|
|
return ResultFromScode(E_INVALIDARG);
|
|
|
|
return m_pObj->RenderText(pSTM, TEXT("GetDataHere"), FL_USE_ITEM);
|
|
|
|
default:
|
|
return ResultFromScode( DATA_E_FORMATETC );
|
|
|
|
}
|
|
return ResultFromScode(E_NOTIMPL);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CImpIDataObject::QueryGetData(
|
|
LPFORMATETC pFE
|
|
)
|
|
{
|
|
UINT cf = pFE->cfFormat;
|
|
BOOL fRet = FALSE;
|
|
|
|
if (!(DVASPECT_CONTENT & pFE->dwAspect))
|
|
return ResultFromScode(DATA_E_FORMATETC);
|
|
|
|
switch (cf)
|
|
{
|
|
case CF_TEXT:
|
|
fRet = (BOOL) (pFE->tymed & TYMED_HGLOBAL);
|
|
break;
|
|
|
|
default:
|
|
fRet = FALSE;
|
|
break;
|
|
}
|
|
return fRet ? NOERROR : ResultFromScode(S_FALSE);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CImpIDataObject::GetCanonicalFormatEtc(
|
|
LPFORMATETC pFEIn,
|
|
LPFORMATETC pFEOut
|
|
)
|
|
{
|
|
if (NULL==pFEOut)
|
|
return ResultFromScode(E_INVALIDARG);
|
|
|
|
pFEOut->ptd = NULL;
|
|
return ResultFromScode(DATA_S_SAMEFORMATETC);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CImpIDataObject::SetData(
|
|
LPFORMATETC pFE,
|
|
STGMEDIUM FAR *pST,
|
|
BOOL fRelease
|
|
)
|
|
{
|
|
UINT cf = pFE->cfFormat;
|
|
int iArg;
|
|
|
|
if (!(DVASPECT_CONTENT & pFE->dwAspect))
|
|
return ResultFromScode(DATA_E_FORMATETC);
|
|
|
|
switch (cf)
|
|
{
|
|
case CF_TEXT:
|
|
if (!(TYMED_HGLOBAL & pFE->tymed))
|
|
break;
|
|
|
|
if(TYMED_HGLOBAL != pST->tymed)
|
|
return ResultFromScode(E_INVALIDARG);
|
|
|
|
LPTSTR psz=(LPTSTR)GlobalLock(pST->hGlobal); // Lock
|
|
iArg = *((long*)psz); // Use
|
|
GlobalUnlock(pST->hGlobal); // Unlock
|
|
|
|
if(iArg > 0)
|
|
{
|
|
m_pObj->m_cDataSize = iArg;
|
|
return NOERROR;
|
|
}
|
|
}
|
|
if(-1 == iArg && fRelease)
|
|
{
|
|
ReleaseStgMedium(pST);
|
|
return NOERROR;
|
|
}
|
|
return ResultFromScode(E_NOTIMPL);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CImpIDataObject::EnumFormatEtc(
|
|
DWORD dwDir,
|
|
LPENUMFORMATETC FAR *ppEnum
|
|
)
|
|
{
|
|
switch (dwDir)
|
|
{
|
|
case DATADIR_GET:
|
|
*ppEnum = (LPENUMFORMATETC) new CEnumFormatEtc(
|
|
m_pUnkOuter,
|
|
m_pObj->m_cfeGet,
|
|
m_pObj->m_rgfeGet );
|
|
break;
|
|
|
|
case DATADIR_SET:
|
|
*ppEnum = NULL;
|
|
break;
|
|
|
|
default:
|
|
*ppEnum = NULL;
|
|
break;
|
|
}
|
|
if (NULL == *ppEnum)
|
|
return ResultFromScode(E_FAIL);
|
|
else
|
|
(*ppEnum)->AddRef();
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CImpIDataObject::DAdvise(
|
|
LPFORMATETC pFE,
|
|
DWORD dwFlags,
|
|
LPADVISESINK pIAdviseSink,
|
|
LPDWORD pdwConn
|
|
)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (NULL == m_pObj->m_pIDataAdviseHolder)
|
|
{
|
|
hr = CreateDataAdviseHolder(&m_pObj->m_pIDataAdviseHolder);
|
|
if(FAILED(hr))
|
|
return ResultFromScode(E_OUTOFMEMORY);
|
|
}
|
|
hr = m_pObj->m_pIDataAdviseHolder->Advise(
|
|
(LPDATAOBJECT)this,
|
|
pFE,
|
|
dwFlags,
|
|
pIAdviseSink,
|
|
pdwConn );
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CImpIDataObject::DUnadvise(
|
|
DWORD dwConn
|
|
)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (NULL==m_pObj->m_pIDataAdviseHolder)
|
|
return ResultFromScode(E_FAIL);
|
|
hr = m_pObj->m_pIDataAdviseHolder->Unadvise(dwConn);
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CImpIDataObject::EnumDAdvise(
|
|
LPENUMSTATDATA FAR *ppEnum
|
|
)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (NULL==m_pObj->m_pIDataAdviseHolder)
|
|
return ResultFromScode(E_FAIL);
|
|
|
|
hr = m_pObj->m_pIDataAdviseHolder->EnumAdvise(ppEnum);
|
|
return hr;
|
|
}
|
|
|