530 lines
14 KiB
C++
530 lines
14 KiB
C++
//**********************************************************************
|
|
// File name: IDO.CPP
|
|
//
|
|
// Implementation file for the CDataObject Class
|
|
//
|
|
// Functions:
|
|
//
|
|
// See ido.h for a list of member functions.
|
|
//
|
|
// Copyright (c) 1993 Microsoft Corporation. All rights reserved.
|
|
//**********************************************************************
|
|
|
|
#include "pre.h"
|
|
#include "obj.h"
|
|
#include "ido.h"
|
|
#include "app.h"
|
|
#include "doc.h"
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CDataObject::QueryInterface
|
|
//
|
|
// Purpose:
|
|
// Used for interface negotiation
|
|
//
|
|
// Parameters:
|
|
//
|
|
// REFIID riid - Interface being queried for.
|
|
//
|
|
// LPVOID FAR *ppvObj - Out pointer for the interface.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// S_OK - Success
|
|
// E_NOINTERFACE - Failure
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// CSimpSvrObj::QueryInterface OBJ.CPP
|
|
//
|
|
//********************************************************************
|
|
|
|
|
|
STDMETHODIMP CDataObject::QueryInterface ( REFIID riid, LPVOID FAR* ppvObj)
|
|
{
|
|
TestDebugOut(TEXT("In CDataObject::QueryInterface\r\n"));
|
|
|
|
return m_lpObj->QueryInterface(riid, ppvObj);
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CDataObject::AddRef
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Increments the reference count on CSimpSvrObj. CDataObject is
|
|
// a nested class of CSimpSvrObj, so we don't need a separate
|
|
// reference count for CDataObject. We can just use the reference
|
|
// count of CSimpSvrObj.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// None
|
|
//
|
|
// Return Value:
|
|
//
|
|
// The new Reference count on CSimpSvrObject
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// OuputDebugString Windows API
|
|
// CSimpSvrObj::AddRef OBJ.CPP
|
|
//
|
|
//********************************************************************
|
|
|
|
STDMETHODIMP_(ULONG) CDataObject::AddRef ()
|
|
{
|
|
TestDebugOut(TEXT("In CDataObject::AddRef\r\n"));
|
|
|
|
return( m_lpObj->AddRef() );
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CDataObject::Release
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Decrements the reference count on CSimpSvrObj. CDataObject is
|
|
// a nested class of CSimpSvrObj, so we don't need a separate
|
|
// reference count for CDataObject. We can just use the reference
|
|
// count of CSimpSvrObj.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// None
|
|
//
|
|
// Return Value:
|
|
//
|
|
// The new reference count of the CSimpSvrObj.
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// TestDebugOut Windows API
|
|
// CSimpSvrObj::Release OBJ.CPP
|
|
//
|
|
//********************************************************************
|
|
|
|
STDMETHODIMP_(ULONG) CDataObject::Release ()
|
|
{
|
|
TestDebugOut(TEXT("In CDataObject::Release\r\n"));
|
|
|
|
return( m_lpObj->Release() );
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CDataObject::QueryGetData
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Called to determine if our object supports a particular
|
|
// FORMATETC.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// LPFORMATETC pformatetc - Pointer to the FORMATETC being queried for.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// DATA_E_FORMATETC - The FORMATETC is not supported
|
|
// S_OK - The FORMATETC is supported.
|
|
//
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// TestDebugOut Windows API
|
|
// ResultFromScode OLE API
|
|
//
|
|
//********************************************************************
|
|
|
|
|
|
STDMETHODIMP CDataObject::QueryGetData ( LPFORMATETC pformatetc )
|
|
{
|
|
SCODE sc = DATA_E_FORMATETC;
|
|
|
|
TestDebugOut(TEXT("In CDataObject::QueryGetData\r\n"));
|
|
|
|
// check the validity of the formatetc.
|
|
if ( (pformatetc->cfFormat == CF_METAFILEPICT) &&
|
|
(pformatetc->dwAspect == DVASPECT_CONTENT) &&
|
|
(pformatetc->tymed == TYMED_MFPICT) )
|
|
sc = S_OK;
|
|
|
|
return ResultFromScode(sc);
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CDataObject::DAdvise
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Called by the container when it would like to be notified of
|
|
// changes in the object data.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// FORMATETC FAR* pFormatetc - The format the container is interested in.
|
|
//
|
|
// DWORD advf - The type of advise to be set up.
|
|
//
|
|
// LPADVISESINK pAdvSink - Pointer to the containers IAdviseSink
|
|
//
|
|
// DWORD FAR* pdwConnection - Out parameter to return a unique connection id.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// passed on from IDataAdviseHolder
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// TestDebugOut Windows API
|
|
// CreateDataAdviseHolder OLE API
|
|
// IDataAdviseHolder::Advise OLE API
|
|
//
|
|
//
|
|
//********************************************************************
|
|
|
|
|
|
STDMETHODIMP CDataObject::DAdvise ( FORMATETC FAR* pFormatetc, DWORD advf,
|
|
LPADVISESINK pAdvSink, DWORD FAR* pdwConnection)
|
|
{
|
|
HRESULT hRes;
|
|
|
|
TestDebugOut(TEXT("In CDataObject::DAdvise\r\n"));
|
|
|
|
// if no DataAdviseHolder has been created, then create one.
|
|
if (!m_lpObj->m_lpDataAdviseHolder)
|
|
{
|
|
hRes=CreateDataAdviseHolder(&m_lpObj->m_lpDataAdviseHolder);
|
|
if (hRes != S_OK)
|
|
{
|
|
TestDebugOut(TEXT("CDataObject::DAdvise \
|
|
cannot CreateDataAdviseHolder\n"));
|
|
return(hRes);
|
|
}
|
|
}
|
|
|
|
// pass on to the DataAdviseHolder
|
|
return m_lpObj->m_lpDataAdviseHolder->Advise( this, pFormatetc, advf,
|
|
pAdvSink, pdwConnection);
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CDataObject::GetData
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Returns the data in the format specified in pformatetcIn.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// LPFORMATETC pformatetcIn - The format requested by the caller
|
|
//
|
|
// LPSTGMEDIUM pmedium - The medium requested by the caller
|
|
//
|
|
// Return Value:
|
|
//
|
|
// DATA_E_FORMATETC - Format not supported
|
|
// S_OK - Success
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// TestDebugOut Windows API
|
|
// CSimpSvrObj::GetMetaFilePict() OBJ.CPP
|
|
// ResultFromScode OLE API
|
|
//
|
|
//********************************************************************
|
|
|
|
STDMETHODIMP CDataObject::GetData ( LPFORMATETC pformatetcIn, LPSTGMEDIUM pmedium )
|
|
{
|
|
SCODE sc = DATA_E_FORMATETC;
|
|
|
|
TestDebugOut(TEXT("In CDataObject::GetData\r\n"));
|
|
|
|
// Check to the FORMATETC and fill pmedium if valid.
|
|
if ( (pformatetcIn->cfFormat == CF_METAFILEPICT) &&
|
|
(pformatetcIn->dwAspect == DVASPECT_CONTENT) &&
|
|
(pformatetcIn->tymed & TYMED_MFPICT) )
|
|
{
|
|
HANDLE hmfPict = m_lpObj->GetMetaFilePict();
|
|
pmedium->tymed = TYMED_MFPICT;
|
|
pmedium->hGlobal = hmfPict;
|
|
pmedium->pUnkForRelease = NULL;
|
|
sc = S_OK;
|
|
}
|
|
|
|
return ResultFromScode( sc );
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CDataObject::DUnadvise
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Breaks down an Advise connection.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// DWORD dwConnection - Advise connection ID.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Returned from the DataAdviseHolder.
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// TestDebugOut Windows API
|
|
// IDataAdviseHolder::Unadvise OLE
|
|
//
|
|
//********************************************************************
|
|
|
|
STDMETHODIMP CDataObject::DUnadvise ( DWORD dwConnection)
|
|
{
|
|
TestDebugOut(TEXT("In CDataObject::DUnadvise\r\n"));
|
|
|
|
return m_lpObj->m_lpDataAdviseHolder->Unadvise(dwConnection);
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CDataObject::GetDataHere
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Called to get a data format in a caller supplied location
|
|
//
|
|
// Parameters:
|
|
//
|
|
// LPFORMATETC pformatetc - FORMATETC requested
|
|
//
|
|
// LPSTGMEDIUM pmedium - Medium to return the data
|
|
//
|
|
// Return Value:
|
|
//
|
|
// DATA_E_FORMATETC - We don't support the requested format
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// TestDebugOut Windows API
|
|
//
|
|
// Comments:
|
|
//
|
|
// In this simple implementation, we don't really support this
|
|
// method, we just always return DATA_E_FORMATETC.
|
|
//
|
|
//********************************************************************
|
|
|
|
|
|
STDMETHODIMP CDataObject::GetDataHere ( LPFORMATETC pformatetc,
|
|
LPSTGMEDIUM pmedium )
|
|
{
|
|
TestDebugOut(TEXT("In CDataObject::GetDataHere\r\n"));
|
|
return ResultFromScode( DATA_E_FORMATETC);
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CDataObject::GetCanonicalFormatEtc
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Returns a FORMATETC that is equivalent to the one passed in.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// LPFORMATETC pformatetc - FORMATETC to be tested.
|
|
//
|
|
// LPFORMATETC pformatetcOut - Out ptr for returned FORMATETC.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// DATA_S_SAMEFORMATETC - Use the same formatetc as was passed.
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// TestDebugOut Windows API
|
|
// CoGetMalloc OLE API
|
|
// IMalloc::Alloc OLE
|
|
// IMalloc::Release OLE
|
|
// _fmemcpy C run-time
|
|
//
|
|
//********************************************************************
|
|
|
|
|
|
STDMETHODIMP CDataObject::GetCanonicalFormatEtc ( LPFORMATETC pformatetc,
|
|
LPFORMATETC pformatetcOut)
|
|
{
|
|
HRESULT hresult;
|
|
TestDebugOut(TEXT("In CDataObject::GetCanonicalFormatEtc\r\n"));
|
|
|
|
if (!pformatetcOut)
|
|
return ResultFromScode(E_INVALIDARG);
|
|
|
|
/* OLE2NOTE: we must make sure to set all out parameters to NULL. */
|
|
pformatetcOut->ptd = NULL;
|
|
|
|
if (!pformatetc)
|
|
return ResultFromScode(E_INVALIDARG);
|
|
|
|
// OLE2NOTE: we must validate that the format requested is supported
|
|
if ((hresult = QueryGetData(pformatetc)) != NOERROR)
|
|
return hresult;
|
|
|
|
/* OLE2NOTE: an app that is insensitive to target device (as
|
|
** SimpSvr is) should fill in the lpformatOut parameter
|
|
** but NULL out the "ptd" field; it should return NOERROR if the
|
|
** input formatetc->ptd what non-NULL. this tells the caller
|
|
** that it is NOT necessary to maintain a separate screen
|
|
** rendering and printer rendering. if should return
|
|
** DATA_S_SAMEFORMATETC if the input and output formatetc's are
|
|
** identical.
|
|
*/
|
|
|
|
*pformatetcOut = *pformatetc;
|
|
if (pformatetc->ptd == NULL)
|
|
return ResultFromScode(DATA_S_SAMEFORMATETC);
|
|
else
|
|
{
|
|
pformatetcOut->ptd = NULL;
|
|
return NOERROR;
|
|
}
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CDataObject::SetData
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Called to set the data for the object.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// LPFORMATETC pformatetc - the format of the data being passed
|
|
//
|
|
// STGMEDIUM FAR * pmedium - the location of the data.
|
|
//
|
|
// BOOL fRelease - Defines the ownership of the medium
|
|
//
|
|
// Return Value:
|
|
//
|
|
// DATA_E_FORMATETC - Not a valid FORMATETC for this object
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// TestDebugOut Windows API
|
|
//
|
|
// Comments:
|
|
//
|
|
// This simple object does not support having its data set, so an
|
|
// error value is always returned.
|
|
//
|
|
//********************************************************************
|
|
|
|
|
|
STDMETHODIMP CDataObject::SetData ( LPFORMATETC pformatetc, STGMEDIUM FAR * pmedium,
|
|
BOOL fRelease)
|
|
{
|
|
TestDebugOut(TEXT("In CDataObject::SetData\r\n"));
|
|
return ResultFromScode( DATA_E_FORMATETC );
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CDataObject::EnumFormatEtc
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Enumerates the formats supported by this object.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// DWORD dwDirection - Order of enumeration.
|
|
//
|
|
// LPENUMFORMATETC FAR* ppenumFormatEtc - Place to return a pointer
|
|
// to the enumerator.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// OLE_S_USEREG - Indicates that OLE should consult the REG DB
|
|
// to enumerate the formats.
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// TestDebugOut Windows API
|
|
//
|
|
// Comments:
|
|
//
|
|
// This simple implementation just returns OLE_SUSEREG
|
|
//
|
|
//********************************************************************
|
|
|
|
|
|
STDMETHODIMP CDataObject::EnumFormatEtc ( DWORD dwDirection,
|
|
LPENUMFORMATETC FAR* ppenumFormatEtc)
|
|
{
|
|
TestDebugOut(TEXT("In CDataObject::EnumFormatEtc\r\n"));
|
|
// need to NULL the out parameter
|
|
*ppenumFormatEtc = NULL;
|
|
return ResultFromScode( OLE_S_USEREG );
|
|
}
|
|
|
|
//**********************************************************************
|
|
//
|
|
// CDataObject::EnumDAdvise
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Returns an enumerator that enumerates all of the advises
|
|
// set up on this data object.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// LPENUMSTATDATA FAR* ppenumAdvise - An out ptr in which to
|
|
// return the enumerator.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Passed back from IDataAdviseHolder::EnumAdvise
|
|
//
|
|
// Function Calls:
|
|
// Function Location
|
|
//
|
|
// TestDebugOut Windows API
|
|
// IDAtaAdviseHolder::EnumAdvise OLE
|
|
//
|
|
// Comments:
|
|
//
|
|
// This just delegates to the DataAdviseHolder.
|
|
//
|
|
//********************************************************************
|
|
|
|
|
|
STDMETHODIMP CDataObject::EnumDAdvise ( LPENUMSTATDATA FAR* ppenumAdvise)
|
|
{
|
|
TestDebugOut(TEXT("In CDataObject::EnumDAdvise\r\n"));
|
|
// need to NULL the out parameter
|
|
*ppenumAdvise = NULL;
|
|
|
|
return m_lpObj->m_lpDataAdviseHolder->EnumAdvise(ppenumAdvise);
|
|
}
|
|
|
|
|