DATAOBJ.H

///////////////////////////////////////////////////////////////////////////// 
// dataobj.h : IDataObject Interface to communicate data
//
// This is a part of the MMC SDK.
// Copyright (C) 1997 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// MMC SDK Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// MMC Library product.
//

#ifndef __DATAOBJ_H_
#define __DATAOBJ_H_

#include <mmc.h>

//
// Defines, Types etc...
//

typedef enum tagCOOKIETYPE
{
COOKIE_IS_ROOT,
COOKIE_IS_STATUS

} COOKIETYPE;


class CComponentData; // Forward declaration


/////////////////////////////////////////////////////////////////////////////
// CDataObject - This class is used to pass data back and forth with MMC. It
// uses a standard interface, IDataObject to acomplish this. Refer
// to OLE documentation for a description of clipboard formats and
// the IdataObject interface.

class CDataObject:
public IDataObject,
public CComObjectRoot
{
public:

// ATL Maps
DECLARE_NOT_AGGREGATABLE(CDataObject)

BEGIN_COM_MAP(CDataObject)
COM_INTERFACE_ENTRY(IDataObject)
END_COM_MAP()


CDataObject();
~CDataObject();

VOID SetCookie(ULONG ulCookie, DATA_OBJECT_TYPES Type, COOKIETYPE ct);

//
// IUnknown overrides
//

STDMETHOD(QueryInterface) (REFIID riid, LPVOID FAR* ppvObj);
STDMETHOD_(ULONG, AddRef) ();
STDMETHOD_(ULONG, Release) ();

//
// IDataObject implementation methods
//

STDMETHOD(GetDataHere)(FORMATETC *pformatetc, STGMEDIUM *pmedium);

// Not Implemented
private:
STDMETHOD(GetData)(LPFORMATETC lpFormatetcIn, LPSTGMEDIUM lpMedium)
{ return E_NOTIMPL; };

STDMETHOD(EnumFormatEtc)(DWORD dwDirection, LPENUMFORMATETC* ppEnumFormatEtc)
{ return E_NOTIMPL; };

STDMETHOD(QueryGetData)(LPFORMATETC lpFormatetc)
{ return E_NOTIMPL; };

STDMETHOD(GetCanonicalFormatEtc)(LPFORMATETC lpFormatetcIn, LPFORMATETC lpFormatetcOut)
{ return E_NOTIMPL; };

STDMETHOD(SetData)(LPFORMATETC lpFormatetc, LPSTGMEDIUM lpMedium, BOOL bRelease)
{ return E_NOTIMPL; };

STDMETHOD(DAdvise)(LPFORMATETC lpFormatetc, DWORD advf, LPADVISESINK pAdvSink, LPDWORD pdwConnection)
{ return E_NOTIMPL; };

STDMETHOD(DUnadvise)(DWORD dwConnection)
{ return E_NOTIMPL; };

STDMETHOD(EnumDAdvise)(LPENUMSTATDATA* ppEnumAdvise)
{ return E_NOTIMPL; };

//
// Non-interface member functions
//
public:
DATA_OBJECT_TYPES GetContext() { return m_Context; }
COOKIETYPE GetCookieType() { return m_Type; }
ULONG CDataObject::GetCookie() { return m_ulCookie; }

private:
HRESULT _WriteInternal(IStream *pstm);
HRESULT _WriteDisplayName(IStream *pstm);
HRESULT _WriteNodeType(IStream *pstm);
HRESULT _WriteClsid(IStream *pstm);

ULONG m_cRefs; // object refcount
ULONG m_ulCookie; // what this obj refers to
DATA_OBJECT_TYPES m_Context; // context in which this was created
COOKIETYPE m_Type; // how to interpret _ulCookie

public:
// At a minimum we have to implement these clipboard formats
// to keep MMC happy. We will ASSERT if we don't
static UINT s_cfInternal; // Our custom clipboard format
static UINT s_cfDisplayName;
static UINT s_cfNodeType;
static UINT s_cfSnapinClsid;
};

#endif // __DATAOBJ_H_