DATAOBJ.H
/* 
 * DATAOBJ.H 
 * Data Object Chapter 10 
 * 
 * Classes that implement the Data Object independent of whether 
 * we live in a DLL or EXE. 
 * 
 * Copyright (c)1993-1995 Microsoft Corporation, All Right Reserved 
 * 
 * Kraig Brockschmidt, Microsoft 
 * Internet  :  kraigb@microsoft.com 
 * Compuserve:  >INTERNET:kraigb@microsoft.com 
 */ 
 
 
#ifndef _DATAOBJ_H_ 
#define _DATAOBJ_H_ 
 
#define INC_OLE2 
#define CHAPTER10 
#include <inole.h> 
 
//Data size types 
#define DOSIZE_SMALL        0 
#define DOSIZE_MEDIUM       1 
#define DOSIZE_LARGE        2 
#define DOSIZE_CSIZES       3 
 
//Data sizes 
#define CCHTEXTSMALL        64      //Text grows * 16 charactrs 
#define CCHTEXTMEDIUM       1024 
#define CCHTEXTLARGE        16384 
 
#define CXYBITMAPSMALL      16      //Bitmaps grow * 4 pixels 
#define CXYBITMAPMEDIUM     64 
#define CXYBITMAPLARGE      256 
 
#define CRECMETAFILESMALL   4       //Metafiles grows * 9 records; 
#define CRECMETAFILEMEDIUM  12      //the number of actual records 
#define CRECMETAFILELARGE   36      //is the square of these 
 
 
//Resources for this data object. 
#define IDB_MIN             1       //Keep this DOSIZE_SMALL+1 
#define IDB_16BY16          1 
#define IDB_64BY64          2 
#define IDB_256BY256        3 
#define IDB_MAX             3 
 
 
#define IDR_MENU                        1 
#define IDR_ADVISORICON                 1 
 
#define IDM_ADVISEITERATIONSMIN         100 
#define IDM_ADVISEITERATIONS16          100 
#define IDM_ADVISEITERATIONS64          101 
#define IDM_ADVISEITERATIONS144         102 
#define IDM_ADVISEITERATIONS256         103 
#define IDM_ADVISEITERATIONS400         104 
#define IDM_ADVISEITERATIONS572         105 
 
 
 
 
/* 
 * The DataObject object is implemented in its own class with its 
 * own IUnknown to support aggregation.  It contains one 
 * CImpIDataObject object that we use to implement the externally 
 * exposed interfaces. 
 */ 
 
#define CFORMATETCGET       3 
 
 
//DATAOBJ.CPP 
LRESULT APIENTRY AdvisorWndProc(HWND, UINT, WPARAM, LPARAM); 
 
class CImpIDataObject; 
typedef class CImpIDataObject *PCImpIDataObject; 
 
 
class CDataObject : public IUnknown 
    { 
    friend class CImpIDataObject; 
    friend LRESULT APIENTRY AdvisorWndProc(HWND, UINT 
        , WPARAM, LPARAM); 
 
    protected: 
        ULONG               m_cRef; 
        LPUNKNOWN           m_pUnkOuter; 
        PFNDESTROYED        m_pfnDestroy; 
 
        UINT                m_iSize;        //Data size for Render* 
        HBITMAP             m_rghBmp[DOSIZE_CSIZES]; //Cache bitmaps 
 
        HWND                m_hWndAdvise;   //Popup with Advise menu 
        DWORD               m_dwAdvFlags;   //Notification flags 
 
        //Contained interface implemetation 
        PCImpIDataObject    m_pImpIDataObject; 
 
        //Other interfaces used, implemented elsewhere 
        LPDATAADVISEHOLDER  m_pIDataAdviseHolder; 
 
        //Arrays for IDataObject::EnumFormatEtc 
        ULONG               m_cfeGet; 
        FORMATETC           m_rgfeGet[CFORMATETCGET]; 
 
    protected: 
        //Functions for use from IDataObject::GetData 
        HRESULT     RenderText(LPSTGMEDIUM); 
        HRESULT     RenderBitmap(LPSTGMEDIUM); 
        HRESULT     RenderMetafilePict(LPSTGMEDIUM); 
 
    public: 
        CDataObject(LPUNKNOWN, PFNDESTROYED, UINT); 
        ~CDataObject(void); 
 
        BOOL Init(void); 
 
        //Non-delegating object IUnknown 
        STDMETHODIMP         QueryInterface(REFIID, PPVOID); 
        STDMETHODIMP_(ULONG) AddRef(void); 
        STDMETHODIMP_(ULONG) Release(void); 
    }; 
 
typedef CDataObject *PCDataObject; 
 
 
 
/* 
 * Interface implementations for the CDataObject object. 
 */ 
 
class CImpIDataObject : public IDataObject 
    { 
    private: 
        ULONG           m_cRef; 
        PCDataObject    m_pObj; 
        LPUNKNOWN       m_pUnkOuter; 
 
    public: 
        CImpIDataObject(PCDataObject, LPUNKNOWN); 
        ~CImpIDataObject(void); 
 
        //IUnknown members that delegate to m_pUnkOuter. 
        STDMETHODIMP         QueryInterface(REFIID, PPVOID); 
        STDMETHODIMP_(ULONG) AddRef(void); 
        STDMETHODIMP_(ULONG) Release(void); 
 
        //IDataObject members 
        STDMETHODIMP GetData(LPFORMATETC, LPSTGMEDIUM); 
        STDMETHODIMP GetDataHere(LPFORMATETC, LPSTGMEDIUM); 
        STDMETHODIMP QueryGetData(LPFORMATETC); 
        STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC,LPFORMATETC); 
        STDMETHODIMP SetData(LPFORMATETC, LPSTGMEDIUM, BOOL); 
        STDMETHODIMP EnumFormatEtc(DWORD, LPENUMFORMATETC *); 
        STDMETHODIMP DAdvise(LPFORMATETC, DWORD,  LPADVISESINK 
            , DWORD *); 
        STDMETHODIMP DUnadvise(DWORD); 
        STDMETHODIMP EnumDAdvise(LPENUMSTATDATA *); 
    }; 
 
 
 
/* 
 * IEnumFORMATETC object that is created from 
 * IDataObject::EnumFormatEtc.  This object lives on its own. 
 */ 
 
class CEnumFormatEtc : public IEnumFORMATETC 
    { 
    private: 
        ULONG           m_cRef;         //Object reference count 
        ULONG           m_iCur;         //Current element. 
        ULONG           m_cfe;          //Number of FORMATETCs in us 
        LPFORMATETC     m_prgfe;        //Source of FORMATETCs 
 
    public: 
        CEnumFormatEtc(ULONG, LPFORMATETC); 
        ~CEnumFormatEtc(void); 
 
        //IUnknown members 
        STDMETHODIMP         QueryInterface(REFIID, PPVOID); 
        STDMETHODIMP_(ULONG) AddRef(void); 
        STDMETHODIMP_(ULONG) Release(void); 
 
        //IEnumFORMATETC members 
        STDMETHODIMP Next(ULONG, LPFORMATETC, ULONG *); 
        STDMETHODIMP Skip(ULONG); 
        STDMETHODIMP Reset(void); 
        STDMETHODIMP Clone(IEnumFORMATETC **); 
    }; 
 
 
typedef CEnumFormatEtc *PCEnumFormatEtc; 
 
#endif //_DATAOBJ_H_