/////////////////////////////////////////////////////////////////////////////
//
//	Copyright (c) 1997-1999 Microsoft Corporation
//
//	Module Name:
//		Network.h
//
//	Abstract:
//		Definition of the CNetwork class.
//
//	Implementation File:
//		Network.cpp
//
//	Author:
//		David Potter (davidp)	May 28, 1997
//
//	Revision History:
//
//	Notes:
//
/////////////////////////////////////////////////////////////////////////////

#ifndef _NETWORK_H_
#define _NETWORK_H_

/////////////////////////////////////////////////////////////////////////////
// Forward Class Declarations
/////////////////////////////////////////////////////////////////////////////

class CNetwork;
class CNetworkList;

/////////////////////////////////////////////////////////////////////////////
// External Class Declarations
/////////////////////////////////////////////////////////////////////////////

class CNetInterface;
class CNetInterfaceList;

/////////////////////////////////////////////////////////////////////////////
// Type Definitions
/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
// Include Files
/////////////////////////////////////////////////////////////////////////////

#ifndef _CLUSITEM_H_
#include "ClusItem.h"	// for CClusterItem
#endif

#ifndef _PROPLIST_H_
#include "PropList.h"	// for CObjectProperty, CClusPropList
#endif

/////////////////////////////////////////////////////////////////////////////
// CNetwork command target
/////////////////////////////////////////////////////////////////////////////

class CNetwork : public CClusterItem
{
	DECLARE_DYNCREATE(CNetwork)

// Construction
public:
	CNetwork(void);		// protected constructor used by dynamic creation
	void					Init(IN OUT CClusterDoc * pdoc, IN LPCTSTR lpszName);

protected:
	void					CommonConstruct(void);

// Attributes
protected:
	HNETWORK				m_hnetwork;
    CLUSTER_NETWORK_STATE	m_cns;

	CLUSTER_NETWORK_ROLE	m_cnr;
	CString					m_strAddress;
	CString					m_strAddressMask;

	DWORD					m_dwCharacteristics;
	DWORD					m_dwFlags;

	CNetInterfaceList *		m_plpciNetInterfaces;

	enum
	{
		epropName = 0,
		epropRole,
		epropAddress,
		epropAddressMask,
		epropDescription,
		epropMAX
	};

	CObjectProperty		m_rgProps[epropMAX];

public:
	HNETWORK				Hnetwork(void) const				{ return m_hnetwork; }
	CLUSTER_NETWORK_STATE	Cns(void) const						{ return m_cns; }

	CLUSTER_NETWORK_ROLE	Cnr(void) const						{ return m_cnr; }
	const CString &			StrAddress(void) const				{ return m_strAddress; }
	const CString &			StrAddressMask(void) const			{ return m_strAddressMask; }
	DWORD					DwCharacteristics(void) const		{ return m_dwCharacteristics; }
	DWORD					DwFlags(void) const		            { return m_dwFlags; }

	const CNetInterfaceList &	LpciNetInterfaces(void) const	{ ASSERT(m_plpciNetInterfaces != NULL); return *m_plpciNetInterfaces; }

	void					GetStateName(OUT CString & rstrState) const;
	void					GetRoleName(OUT CString & rstrRole) const;

// Operations
public:
	void					CollectInterfaces(IN OUT CNetInterfaceList * plpci) const;

	void					ReadExtensions(void);

	void					AddNetInterface(IN OUT CNetInterface * pciNetIFace);
	void					RemoveNetInterface(IN OUT CNetInterface * pciNetIFace);

	void					SetName(IN LPCTSTR pszName);
	void					SetCommonProperties(
								IN const CString &		rstrDesc,
								IN CLUSTER_NETWORK_ROLE	cnr,
								IN BOOL					bValidateOnly
								);
	void					SetCommonProperties(
								IN const CString &		rstrDesc,
								IN CLUSTER_NETWORK_ROLE	cnr
								)
	{
		SetCommonProperties(rstrDesc, cnr, FALSE /*bValidateOnly*/);
	}
	void					ValidateCommonProperties(
								IN const CString &		rstrDesc,
								IN CLUSTER_NETWORK_ROLE	cnr
								)
	{
		SetCommonProperties(rstrDesc, cnr, TRUE /*bValidateOnly*/);
	}

// Overrides
public:
	virtual void			Cleanup(void);
	virtual void			ReadItem(void);
	virtual void			UpdateState(void);
	virtual void			Rename(IN LPCTSTR pszName);
	virtual	BOOL			BGetColumnData(IN COLID colid, OUT CString & rstrText);
	virtual BOOL			BCanBeEdited(void) const;
	virtual void			OnBeginLabelEdit(IN OUT CEdit * pedit);
	virtual BOOL			BDisplayProperties(IN BOOL bReadOnly = FALSE);

	virtual const CStringList *	PlstrExtensions(void) const;

#ifdef _DISPLAY_STATE_TEXT_IN_TREE
	virtual void			GetTreeName(OUT CString & rstrName) const;
#endif

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CNetwork)
	//}}AFX_VIRTUAL

	virtual LRESULT			OnClusterNotify(IN OUT CClusterNotify * pnotify);

protected:
	virtual const CObjectProperty *	Pprops(void) const	{ return m_rgProps; }
	virtual DWORD					Cprops(void) const	{ return sizeof(m_rgProps) / sizeof(CObjectProperty); }
	virtual DWORD					DwSetCommonProperties(IN const CClusPropList & rcpl, IN BOOL bValidateOnly = FALSE);

// Implementation
public:
	virtual ~CNetwork(void);

public:
	// Generated message map functions
	//{{AFX_MSG(CNetwork)
	afx_msg void OnUpdateProperties(CCmdUI* pCmdUI);
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()

};  //*** class CNetwork

/////////////////////////////////////////////////////////////////////////////
// CNetworkList
/////////////////////////////////////////////////////////////////////////////

class CNetworkList : public CClusterItemList
{
public:
	CNetwork *		PciNetworkFromName(
						IN LPCTSTR		pszName,
						OUT POSITION *	ppos = NULL
						)
	{
		return (CNetwork *) PciFromName(pszName, ppos);
	}

};  //*** class CNetworkList

/////////////////////////////////////////////////////////////////////////////
// Global Functions
/////////////////////////////////////////////////////////////////////////////

//void DeleteAllItemData(IN OUT CNetworkList & rlp);

#ifdef _DEBUG
class CTraceTag;
extern CTraceTag g_tagNetwork;
extern CTraceTag g_tagNetNotify;
#endif

/////////////////////////////////////////////////////////////////////////////

#endif // _NETWORK_H_