text: #ifndef __NmConference_h__
  #define __NmConference_h__
  
  #include "SDKInternal.h"
  #include "FtHook.h"
  
  
  // Forward decls
  class CNmMemberObj;
  class CNmManagerObj;
  
  /////////////////////////////////////////////////////////////////////////////
  // CNmConferenceObj
  class ATL_NO_VTABLE CNmConferenceObj : 
  	public CComObjectRootEx<CComSingleThreadModel>,
  	public IConnectionPointContainerImpl<CNmConferenceObj>,
  	public IConnectionPointImpl<CNmConferenceObj, &IID_INmConferenceNotify, CComDynamicUnkArray>,
  	public INmConference,
  	public INmConferenceNotify2,
  	public IInternalConferenceObj,
  	public IMbftEvents
  {
  
  protected:
  // Data
  	CComPtr<INmConference>		m_spInternalINmConference;
  	CSimpleArray<INmMember*>	m_SDKMemberObjs;
  	CSimpleArray<INmChannel*>	m_SDKChannelObjs;
  	CSimpleArray<GUID>			m_DataChannelGUIDList;
  	DWORD						m_dwInternalINmConferenceAdvise;
  	CNmManagerObj*				m_pManagerObj;
  	NM_CONFERENCE_STATE			m_State;
  	bool						m_bFTHookedUp;
  	BOOL						m_bLocalVideoActive;
  	BOOL						m_bRemoteVideoActive;
  
  public:
  
  DECLARE_PROTECT_FINAL_CONSTRUCT()
  DECLARE_NO_REGISTRY()
  DECLARE_NOT_AGGREGATABLE(CNmConferenceObj)
  
  BEGIN_COM_MAP(CNmConferenceObj)
  	COM_INTERFACE_ENTRY(INmConference)
  	COM_INTERFACE_ENTRY(IConnectionPointContainer)
  	COM_INTERFACE_ENTRY(INmConferenceNotify)
  	COM_INTERFACE_ENTRY(INmConferenceNotify2)
  	COM_INTERFACE_ENTRY(IInternalConferenceObj)
  END_COM_MAP()
  
  BEGIN_CONNECTION_POINT_MAP(CNmConferenceObj)
  	CONNECTION_POINT_ENTRY(IID_INmConferenceNotify)
  END_CONNECTION_POINT_MAP()
  
  // Construction/destruction
  	CNmConferenceObj();
  	~CNmConferenceObj();
  	HRESULT FinalConstruct();
  	ULONG InternalRelease();
  
  	static HRESULT CreateInstance(CNmManagerObj* pManagerObj, INmConference* pInternalINmConferenece, INmConference** ppConference);
  	static HRESULT InitSDK();
  	static void CleanupSDK();
  
  	// INmConference methods
  	STDMETHOD(GetName)(BSTR *pbstrName);
  	STDMETHOD(GetID)(ULONG * puID);
  	STDMETHOD(GetState)(NM_CONFERENCE_STATE *pState);
  	STDMETHOD(GetNmchCaps)(ULONG *puchCaps);
  	STDMETHOD(GetTopProvider)(INmMember **ppMember);
  	STDMETHOD(EnumMember)(IEnumNmMember **ppEnum);
  	STDMETHOD(GetMemberCount)(ULONG *puCount);
  	STDMETHOD(CreateChannel)(INmChannel **ppChannel, ULONG uNmCh, INmMember *pMember);
  	STDMETHOD(EnumChannel)(IEnumNmChannel **ppEnum);
  	STDMETHOD(GetChannelCount)(ULONG *puCount);
  	STDMETHOD(CreateDataChannel)(INmChannelData **ppChannel, REFGUID rguid);
  	STDMETHOD(Host)(void);
  	STDMETHOD(Leave)(void);
  	STDMETHOD(IsHosting)(void);
  	STDMETHOD(LaunchRemote)(REFGUID rguid, INmMember *pMember);
  
  	// INmConferenceNotify2 methods:
  	//
  	STDMETHOD(NmUI)(CONFN uNotify);
  	STDMETHOD(StateChanged)(NM_CONFERENCE_STATE uState);
  	STDMETHOD(MemberChanged)(NM_MEMBER_NOTIFY uNotify, INmMember *pInternalMember);
  	STDMETHOD(ChannelChanged)(NM_CHANNEL_NOTIFY uNotify, INmChannel *pInternalChannel);
  	STDMETHOD(StreamEvent)(NM_STREAMEVENT uEvent, UINT uSubCode,INmChannel *pInternalChannel);
  
  	//IInternalConferenceObj
  	STDMETHOD(GetInternalINmConference)(INmConference** ppConference); 
  	STDMETHOD(GetMemberFromNodeID)(DWORD dwNodeID, INmMember** ppMember);
  	STDMETHOD(RemoveAllMembersAndChannels)();
  	STDMETHOD(AppSharingStateChanged)(BOOL bActive);
  	STDMETHOD(SharableAppStateChanged)(HWND hWnd, NM_SHAPP_STATE state);
  	STDMETHOD(ASLocalMemberChanged)();
  	STDMETHOD(ASMemberChanged)(UINT gccID);
  	STDMETHOD(FireNotificationsToSyncState)();
  	STDMETHOD(AppSharingChannelChanged)();
  	STDMETHOD(FireNotificationsToSyncToInternalObject)();
  	STDMETHOD(EnsureFTChannel)();
  	STDMETHOD(AudioChannelActiveState)(BOOL bActive, BOOL bIsIncoming);
  	STDMETHOD(VideoChannelActiveState)(BOOL bActive, BOOL bIsIncoming);
  	STDMETHOD(VideoChannelPropChanged)(DWORD dwProp, BOOL bIsIncoming);
  	STDMETHOD(VideoChannelStateChanged)(NM_VIDEO_STATE uState, BOOL bIsIncoming);
  
  
  	// IMbftEvent Interface
  	STDMETHOD(OnInitializeComplete)(void);
  	STDMETHOD(OnPeerAdded)(MBFT_PEER_INFO *pInfo);
  	STDMETHOD(OnPeerRemoved)(MBFT_PEER_INFO *pInfo);
  	STDMETHOD(OnFileOffer)(MBFT_FILE_OFFER *pOffer);
  	STDMETHOD(OnFileProgress)(MBFT_FILE_PROGRESS *pProgress);
  	STDMETHOD(OnFileEnd)(MBFTFILEHANDLE hFile);
  	STDMETHOD(OnFileError)(MBFT_EVENT_ERROR *pEvent);
  	STDMETHOD(OnFileEventEnd)(MBFTEVENTHANDLE hEvent);
  	STDMETHOD(OnSessionEnd)(void);
  
  		// Notifications
  	HRESULT Fire_NmUI(CONFN uNotify);
  	HRESULT Fire_StateChanged(NM_CONFERENCE_STATE uState);
  	HRESULT Fire_MemberChanged(NM_MEMBER_NOTIFY uNotify, INmMember *pMember);
  	HRESULT Fire_ChannelChanged(NM_CHANNEL_NOTIFY uNotify, INmChannel *pInternalChannel);
  
  	INmMember* GetSDKMemberFromInternalMember(INmMember* pInternalMember);
  	INmChannel* GetSDKChannelFromInternalChannel(INmChannel* pInternalChannel);
  	INmMember* GetLocalSDKMember();
  
  private:
  // helper Fns
  
  	static HRESULT _CreateInstanceGuts(CComObject<CNmConferenceObj> *p, INmConference** ppConference);
  	HRESULT _RemoveMember(INmMember* pInternalMember);
  	HRESULT _RemoveChannel(INmChannel* pSDKChannel);
  	void _FreeInternalStuff();
  	bool _IsGuidInDataChannelList(GUID& rg);
  	HRESULT _AddAppShareChannel();
  	HRESULT _AddFileTransferChannel();
  	void _EnsureFtChannelAdded();
  	void AddMemberToAsChannel(INmMember* pSDKMember);
  	void RemoveMemberFromAsChannel(INmMember* pSDKMember);
  	void AddMemberToFtChannel(INmMember* pSDKMember);
  	void RemoveMemberFromFtChannel(INmMember* pSDKMember);
  	INmChannel* _GetAppSharingChannel();
  	INmChannel* _GetFtChannel();
  	INmChannel* _GetAudioChannel(BOOL bIncoming);
  	INmChannel* _GetVideoChannel(BOOL bIncoming);
  	HRESULT _ASMemberChanged(INmMember *pSDKMember);
  	void _EnsureMemberHasAVChannelsIfNeeded(INmMember* pSDKMember);
  	void _EnsureMemberHasAVChannel(ULONG ulch, INmMember* pSDKMember);
  	void _EnsureSentConferenceCreatedNotification();
  
  };
  
  #endif // __NmConference_h__
  