#ifndef __NmChannelData_h__
#define __NmChannelData_h__

/////////////////////////////////////////////////////////////////////////////
// CNmChannelDataObj
class ATL_NO_VTABLE CNmChannelDataObj : 
	public CComObjectRootEx<CComSingleThreadModel>,
	public IConnectionPointContainerImpl<CNmChannelDataObj>,
	public IConnectionPointImpl<CNmChannelDataObj, &IID_INmChannelNotify, CComDynamicUnkArray>,
	public IConnectionPointImpl<CNmChannelDataObj, &IID_INmChannelDataNotify, CComDynamicUnkArray>,
	public INmChannelData2,
	public INmChannelDataNotify2,
	public IInternalChannelObj
{

protected:
	CComPtr<INmChannelData>		m_spInternalINmChannelData;
	DWORD						m_dwInternalAdviseCookie;

public:

DECLARE_NO_REGISTRY()
DECLARE_NOT_AGGREGATABLE(CNmChannelDataObj)

BEGIN_COM_MAP(CNmChannelDataObj)
	COM_INTERFACE_ENTRY(INmChannel)
	COM_INTERFACE_ENTRY(INmChannelData)
	COM_INTERFACE_ENTRY(INmChannelData2)
	COM_INTERFACE_ENTRY(INmChannelNotify)
	COM_INTERFACE_ENTRY(INmChannelDataNotify)
	COM_INTERFACE_ENTRY(INmChannelDataNotify2)
	COM_INTERFACE_ENTRY(IInternalChannelObj)
	COM_INTERFACE_ENTRY(IConnectionPointContainer)
END_COM_MAP()


BEGIN_CONNECTION_POINT_MAP(CNmChannelDataObj)
	CONNECTION_POINT_ENTRY(IID_INmChannelNotify)
	CONNECTION_POINT_ENTRY(IID_INmChannelDataNotify)
END_CONNECTION_POINT_MAP()

		// Construction and destruection
	CNmChannelDataObj();
	~CNmChannelDataObj();
	HRESULT FinalConstruct();
	ULONG InternalRelease();
	static HRESULT CreateInstance(CNmConferenceObj* pConfObj, INmChannel* pInternalINmChannel, INmChannel** ppChannel);

	// INmChannelData methods
    STDMETHOD(GetGuid)(GUID *pguid);
    STDMETHOD(SendData)(INmMember *pMember, ULONG uSize, byte *pvBuffer, ULONG uOptions);

	// INmChannelData2 methods
	STDMETHOD(RegistryAllocateHandle)(ULONG numberOfHandlesRequested);

	//INmChannelDataNotify
    STDMETHOD(DataSent)(INmMember *pMember, ULONG uSize,byte *pvBuffer);
    STDMETHOD(DataReceived)(INmMember *pInternalMember,ULONG uSize,byte *pvBuffer, ULONG dwFlags);
    STDMETHOD(AllocateHandleConfirm)(ULONG handle_value, ULONG chandles);

	// IInternalChannelObj methods
	STDMETHOD(GetInternalINmChannel)(INmChannel** ppChannel);
	STDMETHOD(ChannelRemoved)();

	// Helpers
	HRESULT Fire_MemberChanged(NM_MEMBER_NOTIFY uNotify, INmMember *pMember);
	HRESULT Fire_DataSent(INmMember *pSDKMember, ULONG uSize,byte *pvBuffer);
	HRESULT Fire_DataReceived(INmMember *pSDKMember, ULONG uSize, byte *pvBuffer, ULONG dwFlags);
	void _OnActivate(bool bActive) {;}

	virtual CNmConferenceObj* GetConfObj() = 0;
	virtual void RemoveMembers() = 0;
	virtual BOOL GetbActive() = 0;

	HRESULT _IsActive();
	HRESULT _SetActive(BOOL bActive);

};


#endif // __NmChannelData_h__