Leaked source code of windows server 2003
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.
|
|
#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; }
|