/**********************************************************************/
/** 					  Microsoft Windows/NT						 **/
/** 			   Copyright(c) Microsoft Corporation, 1997 - 1999 				 **/
/**********************************************************************/

/*
	atlkprop.cpp
		
	FILE HISTORY:
		
*/

#include "stdafx.h"
#include "atlkprop.h"
#include "atlkview.h"
#include "globals.h"

BEGIN_MESSAGE_MAP(CATLKGeneralPage, RtrPropertyPage)
	//{{AFX_MSG_MAP(CATLKGeneralPage)
ON_BN_CLICKED(IDC_RTR_ATLK_SEEDNETWORK, OnSeedNetwork) // Checkbox

ON_BN_CLICKED(IDC_BTN_ATLK_ZONEADD, OnZoneAdd)
ON_BN_CLICKED(IDC_BTN_ATLK_ZONEREMOVE, OnZoneRemove)
ON_BN_CLICKED(IDC_BTN_ATLK_GETZONES, OnZoneGetZones)
ON_BN_CLICKED(IDC_ATLK_BTN_SET_DEFAULT, OnSetAsDefault)

ON_EN_CHANGE(IDC_RTR_ATLK_FROM, OnRangeLowerChange)
ON_EN_CHANGE(IDC_RTR_ATLK_TO, OnRangeUpperChange)

ON_CBN_SELCHANGE(IDC_RTR_ATLK_LB_DEFZONES, OnSelChangeZones)
// ON_CBN_SELCHANGE(IDC_CMB_ATLK_ZONEDEF, OnSelchangeCmbAtlkZonedef)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
													 

HRESULT CATLKGeneralPage::Init(CATLKPropertySheet *pPropSheet, CAdapterInfo* pAdapterInfo)
{
	m_pAdapterInfo=pAdapterInfo;
	m_pATLKPropSheet = pPropSheet;
	m_fDynFetch=false;
	return hrOK;
}

CATLKGeneralPage::~CATLKGeneralPage()
{
}

void CATLKGeneralPage::DoDataExchange(CDataExchange* pDX)
{
	RtrPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CATLKGeneralPage)
//	DDX_Control(pDX, IDC_CMB_ATLK_ZONEDEF, m_cmbZoneDef);
	DDX_Text(pDX, IDC_RTR_ATLK_DEFAULTZONE_DISPLAY, m_szZoneDef);
	DDX_Control(pDX, IDC_RTR_ATLK_FROM, m_RangeLower);
	DDX_Text(pDX, IDC_RTR_ATLK_FROM, m_iRangeLower);
	DDX_Control(pDX, IDC_RTR_ATLK_TO, m_RangeUpper);
	DDX_Text(pDX, IDC_RTR_ATLK_TO, m_iRangeUpper);
	DDX_Control(pDX, IDC_RTR_ATLK_LB_DEFZONES, m_zones);

	DDX_Control(pDX, IDC_ATLK_SPIN_FROM, m_spinFrom);
	DDX_Control(pDX, IDC_ATLK_SPIN_TO, m_spinTo);	
	//}}AFX_DATA_MAP
}


BOOL CATLKGeneralPage::OnInitDialog()
{
	HRESULT 	hr= hrOK;
	DWORD * 	pdw;
	int 		i;

	// check if router is enabled, if not then disable all the controls on the page
	if(!IfATLKRoutingEnabled())
		EnableChildControls(GetSafeHwnd(), PROPPAGE_CHILD_DISABLE);

	Assert(m_pAdapterInfo);

	RtrPropertyPage::OnInitDialog();

	CheckDlgButton(IDC_RTR_ATLK_SEEDNETWORK, m_pAdapterInfo->m_regInfo.m_dwSeedingNetwork );

	if (m_pAdapterInfo->m_regInfo.m_dwSeedingNetwork)
	{
		TCHAR buf[11];
		m_RangeLower.SetWindowText( _ltot(m_pAdapterInfo->m_regInfo.m_dwRangeLower,buf,10)	);
		m_RangeUpper.SetWindowText( _ltot(m_pAdapterInfo->m_regInfo.m_dwRangeUpper,buf,10)	);
	}
	else
	{	//non-seeded
		
		TCHAR buf[11];
		m_RangeLower.SetWindowText( _ltot(1,buf,10)  );
		m_RangeUpper.SetWindowText( _ltot(1,buf,10)  );

		hr = LoadDynForAdapter();	

		if(!FAILED(hr))
		{
			m_RangeLower.SetWindowText( _ltot(m_pAdapterInfo->m_dynInfo.m_dwRangeLower,buf,10)	);
			m_RangeUpper.SetWindowText( _ltot(m_pAdapterInfo->m_dynInfo.m_dwRangeUpper,buf,10)	);
		}
	}

	SetZones();

	if(IfATLKRoutingEnabled())
		EnableSeedCtrls ( m_pAdapterInfo->m_regInfo.m_dwSeedingNetwork!=0 );

	m_spinFrom.SetRange(0, 8192);
	m_spinTo.SetRange(0, 8192);

	m_spinFrom.SetBuddy(GetDlgItem(IDC_RTR_ATLK_FROM));
	m_spinTo.SetBuddy(GetDlgItem(IDC_RTR_ATLK_TO));

	// disable upper range on local talk
	if(m_pAdapterInfo->m_regInfo.m_dwMediaType == MEDIATYPE_LOCALTALK)
		m_RangeUpper.EnableWindow(FALSE);

	m_dwDefID=GetDefID();  
	  
	SetDirty(FALSE);
	SetModified();

	return TRUE;
}

HRESULT CATLKGeneralPage::LoadDynForAdapter(bool fForce/*=false*/) 
{
	CWaitCursor wait;
	HRESULT 	hr = S_OK;
	if (fForce || !m_fDynFetch)
	{
	   if ( !FHrSucceeded(hr = m_pATLKPropSheet->m_atlkEnv.ReloadAdapter(m_pAdapterInfo, true)) )
	   {
		  DisplayIdErrorMessage2(NULL, IDS_ERR_ARAP_NOADAPTINFO, hr);
		  return hr;
	   }
		  
	   m_fDynFetch=true;
	}
	return hr;
}

void CATLKGeneralPage::OnZoneGetZones() 
{
	CWaitCursor wait;
	Assert(m_pATLKPropSheet);
		
		//forced fetch on dynamic zones for this adapter
	HRESULT hr = LoadDynForAdapter(true);
	if(FAILED(hr))
	{	
//XX		EnableWindow(FALSE);
        return;
	}

	   //load the controls with dynamic zones
	SetZones(true);
	
	   //load new winsock netranges also
	TCHAR buf[11];
	m_RangeLower.SetWindowText( _ltot(m_pAdapterInfo->m_dynInfo.m_dwRangeLower,buf,10)	);
	m_RangeUpper.SetWindowText( _ltot(m_pAdapterInfo->m_dynInfo.m_dwRangeUpper,buf,10)	);

	if (m_pAdapterInfo->m_dynInfo.m_listZones.GetCount()==0)
	{
		AfxMessageBox(IDS_ATLK_NOZONES);
	}

	SetDirty(TRUE);
	SetModified();
    
}

void CATLKGeneralPage::OnRangeLowerChange()
{
	// update upper range automaticcaly on local talk
	if(m_pAdapterInfo->m_regInfo.m_dwMediaType == MEDIATYPE_LOCALTALK)
	{
		CString str;
		m_RangeLower.GetWindowText(str);
		m_RangeUpper.SetWindowText(str);
		m_RangeUpper.UpdateWindow();
	}

	SetDirty(TRUE);
	SetModified();
}

void CATLKGeneralPage::OnRangeUpperChange()
{

	SetDirty(TRUE);
	SetModified();
}

void CATLKGeneralPage::OnSetAsDefault()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	UpdateData(TRUE);

	int i;

	if ( (i = m_zones.GetCurSel()) == LB_ERR )
		return;

	CString sz;
	m_zones.GetText(i, sz);

	m_szZoneDef = sz;

	SetDirty(TRUE);
	SetModified();
	
	GetDlgItem(IDC_ATLK_BTN_SET_DEFAULT)->EnableWindow(false);

	UpdateData(FALSE);
}

void CATLKGeneralPage::SetZones(bool fForceDyn/*=false*/)
{
	POSITION pos;
	Assert(m_pAdapterInfo);
	HRESULT hr = S_OK;
	CString stDefZone;
	int iCmb;

	UpdateData(TRUE);

	Assert(m_zones.GetSafeHwnd());
	m_zones.ResetContent();
//	m_cmbZoneDef.ResetContent();

	CStringList* psl=NULL;

	if (fForceDyn || m_pAdapterInfo->m_regInfo.m_dwSeedingNetwork==0)
	{ //non-seeded or forced uses network zones only 
		hr = LoadDynForAdapter();
		if(FAILED(hr))
		{
//XX			EnableWindow(FALSE);
			goto Error;
		}
	
		stDefZone = m_pAdapterInfo->m_dynInfo.m_szDefaultZone;
		
		psl= &(m_pAdapterInfo->m_dynInfo.m_listZones);
	}
	else
	{ //seeded uses registry settings
		if (m_pAdapterInfo->m_regInfo.m_szDefaultZone.IsEmpty())
		{
			hr = LoadDynForAdapter();
			if(FAILED(hr))
			{
//XX				EnableWindow(FALSE);
				goto Error;
			}
			stDefZone = m_pAdapterInfo->m_dynInfo.m_szDefaultZone;
		}
		else
		{
			stDefZone = m_pAdapterInfo->m_regInfo.m_szDefaultZone;
		}

		//seed rtr--fetch from reg if present; otherwize get winsock ones.	 
		if (m_pAdapterInfo->m_regInfo.m_listZones.GetCount()>0)
		   psl= &(m_pAdapterInfo->m_regInfo.m_listZones);
		else
		{
		   hr = LoadDynForAdapter();
			if(FAILED(hr))
			{
//XX				EnableWindow(FALSE);
				goto Error;
			}
		   psl= &(m_pAdapterInfo->m_dynInfo.m_listZones);
		}
	}
	
	Assert(psl);

	pos = psl->GetHeadPosition();
	while ( pos )
	{
		CString& sz = psl->GetNext(pos);
		if ( sz!=_T("") )
		{
			m_zones.AddString(sz);
//			m_cmbZoneDef.AddString((LPCTSTR)sz);
		}
	}

	if ( m_zones.GetCount()>=1 )
	{
		m_zones.SetCurSel(0);
		OnSelChangeZones();
	}


//	if((iCmb = m_cmbZoneDef.FindStringExact(-1, (LPCTSTR)stDefZone)) != CB_ERR)
//	    m_cmbZoneDef.SetCurSel( iCmb );
	m_szZoneDef = stDefZone;

	UpdateData(FALSE);

	if(IfATLKRoutingEnabled())
		EnableZoneCtrls();	 
Error:	  
;
}

void CATLKGeneralPage::EnableZoneCtrls()
{
	bool f= (m_zones.GetCount()>=1);
	GetDlgItem(IDC_BTN_ATLK_ZONEREMOVE)->EnableWindow(f);

	// Wei Jiang, BUG # 145767
	if(!f && (GetFocus() == GetDlgItem(IDC_BTN_ATLK_ZONEREMOVE)))
		GetDlgItem(IDC_RTR_ATLK_SEEDNETWORK)->SetFocus();


	DWORD i;
	if ( (i = m_zones.GetCurSel()) == LB_ERR )
		return;

	CString sz;
	m_zones.GetText(i, sz);

	if (sz == m_szZoneDef)
		GetDlgItem(IDC_ATLK_BTN_SET_DEFAULT)->EnableWindow(false);
	else
		GetDlgItem(IDC_ATLK_BTN_SET_DEFAULT)->EnableWindow(true);
}

BOOL CATLKGeneralPage::OnApply()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	BOOL		fReturn;
	HRESULT 	hr = hrOK;
	CString sz;
	int 		iCmb;
	Assert(m_pAdapterInfo);

	
	m_pAdapterInfo->m_fModified= !m_pATLKPropSheet->IsCancel();

	if ( m_pAdapterInfo->m_fModified )
	{
		m_pAdapterInfo->m_regInfo.m_dwSeedingNetwork = IsDlgButtonChecked(IDC_RTR_ATLK_SEEDNETWORK);  

		if ( m_pAdapterInfo->m_regInfo.m_dwSeedingNetwork )
		{
			sz = m_szZoneDef;
			BOOL bDefaultZoneInZoneList = FALSE;
			CString szZoneString;
			for (int n = 0;  n < m_zones.GetCount(); n++)
			{
				m_zones.GetText(n, szZoneString);
				if ( sz.CompareNoCase(szZoneString) == 0 )
				{
					bDefaultZoneInZoneList = TRUE;
					break;
				}
			}

			if ( sz.GetLength()>0 )
			{
				if (!bDefaultZoneInZoneList)
				{
					AfxMessageBox(IDS_WRN_ATLK_DELDEFZONE);
					return FALSE;
				}
				m_pAdapterInfo->m_regInfo.m_szDefaultZone=sz;
			}
			else
			{
				AfxMessageBox(IDS_WRN_ATLK_SEEDDEFZONE);
				return FALSE;
			}

			if ( !ValidateNetworkRange() )
			{
				return FALSE;
			}

			m_RangeLower.GetWindowText(sz);
			m_pAdapterInfo->m_regInfo.m_dwRangeLower = _ttol(sz);
			m_RangeUpper.GetWindowText(sz);
			m_pAdapterInfo->m_regInfo.m_dwRangeUpper = _ttol(sz);

			m_pAdapterInfo->m_regInfo.m_listZones.RemoveAll();
			for ( int i=0, c=m_zones.GetCount(); i<c ; i++ )
			{
				m_zones.GetText(i,sz);
				m_pAdapterInfo->m_regInfo.m_listZones.AddTail(sz);						   
			}
			m_pAdapterInfo->m_regInfo.m_listZones.AddTail( _T("") );						 
		}
		else
		{	  //for non-seeded network, remove all seeded values
			m_pAdapterInfo->m_regInfo.m_szDefaultZone=_T("");
			m_pAdapterInfo->m_regInfo.m_dwRangeLower=0;
			m_pAdapterInfo->m_regInfo.m_dwRangeUpper=0;
			m_pAdapterInfo->m_regInfo.m_listZones.RemoveAll();
		}
	}

	fReturn = RtrPropertyPage::OnApply();

	if ( !FHrSucceeded(hr) )
		fReturn = FALSE;
	return fReturn;
}


BOOL CATLKGeneralPage::ValidateNetworkRange() 
{
	CWaitCursor wait;
	CString szLower, szUpper;
	CATLKEnv::AI iter;
	Assert(m_pATLKPropSheet);
	Assert(m_pAdapterInfo);

	
	static bool fLoaded=false;
	
	if (!fLoaded)
	{ //fetch all adapter's dynamic zone & range
	
		if (m_pATLKPropSheet->m_atlkEnv.m_adapterinfolist.size() <= 1)
		{
			if(FAILED(LoadDynForAdapter()))
			{
//XX				EnableWindow(FALSE);
				return FALSE;
			}
		}
		else
		{
			m_pATLKPropSheet->m_atlkEnv.GetAdapterInfo(false);	  
		}	 
		
		fLoaded=true;
	}

	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CATLKEnv::AL& list = m_pATLKPropSheet->m_atlkEnv.m_adapterinfolist;

	m_RangeLower.GetWindowText(szLower);
	m_RangeUpper.GetWindowText(szUpper);
	DWORD dwValueLower = _ttol(szLower);
	DWORD dwValueUpper = _ttol(szUpper);

	BOOL bRetVal = TRUE;

	if ( (dwValueLower < MIN_RANGE_ALLOWED) || (dwValueLower > MAX_RANGE_ALLOWED) )
	{
		CString st;
		st.Format(IDS_ERR_ARAP_LOWERRANGE, MIN_RANGE_ALLOWED, MAX_RANGE_ALLOWED);
		AfxMessageBox((LPCTSTR)st);
		m_RangeLower.SetFocus();
		m_RangeLower.SetSel(0,-1);
		bRetVal = FALSE;
		goto END;
	}
		
	if ( (dwValueUpper < MIN_RANGE_ALLOWED) || (dwValueUpper > MAX_RANGE_ALLOWED) )
	{
		CString st;
		st.Format(IDS_ERR_ARAP_UPPERRANGE, MIN_RANGE_ALLOWED, MAX_RANGE_ALLOWED);
		AfxMessageBox((LPCTSTR)st);
		m_RangeUpper.SetFocus();
		m_RangeUpper.SetSel(0,-1);
		bRetVal = FALSE;
		goto END;
	}

	if ( dwValueLower > dwValueUpper )
	{
		AfxMessageBox(IDS_ERR_ARAP_RANGE);
		m_RangeLower.SetFocus();
		m_RangeLower.SetSel(0,-1);
		bRetVal = FALSE;
		goto END;
	}
		

	for ( iter = list.begin();iter != list.end(); iter++ )
	{
		ATLK_DYN_ADAPTER& adapt =(*iter)->m_dynInfo;

		if ( adapt.m_dwRangeLower==0 && adapt.m_dwRangeUpper==0 )
			continue;

		if ( (*iter)->m_regInfo.m_szAdapter==m_pAdapterInfo->m_regInfo.m_szAdapter )
			continue;

		if ( (dwValueLower >= adapt.m_dwRangeLower) && (dwValueLower <= adapt.m_dwRangeUpper) )
		{
			AfxMessageBox(IDS_ERR_ARAP_LOWERRANGE_OVERLAP);
			m_RangeLower.SetFocus();
			m_RangeLower.SetSel(0,-1);
			bRetVal = FALSE;
			goto END;
		}

		if ( (dwValueUpper >= adapt.m_dwRangeLower) && (dwValueUpper <= adapt.m_dwRangeUpper) )
		{
			AfxMessageBox(IDS_ERR_ARAP_UPPERRANGE_OVERLAP);
			m_RangeUpper.SetFocus();
			m_RangeUpper.SetSel(0,-1);
			bRetVal = FALSE;
			goto END;
		}

		if ( (dwValueLower <= adapt.m_dwRangeLower) && (dwValueUpper >= adapt.m_dwRangeUpper) )
		{
			AfxMessageBox(IDS_ERR_ARAP_RANGE_OVERLAP);
			m_RangeLower.SetFocus();
			m_RangeLower.SetSel(0,-1);
			bRetVal = FALSE;
			goto END;
		}
			
	}

END:
	return bRetVal;
}


void CATLKGeneralPage::OnSeedNetwork() 
{
	EnableSeedCtrls(IsDlgButtonChecked(IDC_RTR_ATLK_SEEDNETWORK)!=0);

	SetDirty(TRUE);
	SetModified();
}

BOOL	IsValidZoneName(CString& str)
{
	if(str.GetLength() > 31 || str.GetLength() <= 0)
		return FALSE;
	
	if(str.FindOneOf(_T("*:=@")) != -1)
		return FALSE;

	int n = str.GetLength();

	while(--n)
	{
		int c = str.GetAt(n);
		if(c >= 128 || !_istprint((wint_t) c))
			return FALSE;
	}

	return TRUE;
}

void CATLKGeneralPage::OnZoneAdd() 
{
	CEditNewZoneDialog	editNewZone(this);

	if( editNewZone.DoModal() == IDOK )
	{
		CString sz;

		editNewZone.GetZone(sz);
		if( sz.GetLength() <= 0 ) 
			return;
	

		sz.TrimLeft();
		sz.TrimRight();
		
		if (!IsValidZoneName(sz))
		{
			AfxMessageBox(IDS_ERR_ATLK_ZONE_NAME);
			return;
		}
		// Validate if the Zone name is valid

		if( LB_ERR	!= m_zones.FindStringExact(-1, (LPCTSTR)sz))
		{
			CString stDupZoneMsg;
			stDupZoneMsg.Format(IDS_ERR_ATLK_DUP_ZONE_NAME, (LPCTSTR)sz);
			AfxMessageBox(stDupZoneMsg);
			return;
		}

		m_zones.AddString(sz);
		m_zones.SelectString(-1,sz);

//		m_cmbZoneDef.AddString((LPCTSTR)sz);
		if (m_szZoneDef.IsEmpty())
			OnSetAsDefault();
		
		EnableZoneCtrls();

		SetDirty(TRUE);
		SetModified();
	}
}

void CATLKGeneralPage::OnZoneRemove() 
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	int i;

	if ( (i = m_zones.GetCurSel()) == LB_ERR )
		return;

	CString sz;
	m_zones.GetText(i, sz);
	m_zones.DeleteString(i);


	EnableZoneCtrls();	 

	if ( sz.CompareNoCase(m_szZoneDef)==0 )
	{
		m_szZoneDef = _T("");
		AfxMessageBox(IDS_WRN_ATLK_DELDEFZONE);
	}

	m_zones.SetCurSel( (m_zones.GetCount() == i) ? i-1 : i );
	OnSelChangeZones();

	SetDirty(TRUE);
	SetModified();
}


void CATLKGeneralPage::OnSelChangeZones()
{
	int i;
	
	if ( (i = m_zones.GetCurSel()) == LB_ERR )
		return;

	CString sz;
	m_zones.GetText(i, sz);

	if (sz == m_szZoneDef)
		GetDlgItem(IDC_ATLK_BTN_SET_DEFAULT)->EnableWindow(false);
	else
		if(IfATLKRoutingEnabled())
			GetDlgItem(IDC_ATLK_BTN_SET_DEFAULT)->EnableWindow(true);

	SetDirty(TRUE);
	SetModified();
}

void CATLKGeneralPage::OnSelchangeCmbAtlkZonedef() 
{
	SetDirty(TRUE);
	SetModified();
}


void CATLKGeneralPage::EnableSeedCtrls(bool fEnable) 
{
	GetDlgItem(IDC_RTR_ATLK_S_RANGE)->EnableWindow(fEnable);
	GetDlgItem(IDC_RTR_ATLK_S_LOWER)->EnableWindow(fEnable);

	GetDlgItem(IDC_RTR_ATLK_DEFAULTZONE_PROMPT)->EnableWindow(fEnable);
	GetDlgItem(IDC_RTR_ATLK_DEFAULTZONE_DISPLAY)->EnableWindow(fEnable);
	GetDlgItem(IDC_ATLK_SPIN_FROM)->EnableWindow(fEnable);
	GetDlgItem(IDC_ATLK_SPIN_TO)->EnableWindow(fEnable);

	m_RangeLower.EnableWindow(fEnable);
	GetDlgItem(IDC_RTR_ATLK_S_UPPER)->EnableWindow(fEnable);
	m_RangeUpper.EnableWindow(fEnable);

    // Windows NT Bug : 354771
	// disable upper range on local talk
	
	if(m_pAdapterInfo->m_regInfo.m_dwMediaType == MEDIATYPE_LOCALTALK)
		m_RangeUpper.EnableWindow(FALSE);

	m_zones.EnableWindow(fEnable);
//	m_cmbZoneDef.EnableWindow(fEnable);
	
	GetDlgItem(IDC_ATLK_BTN_SET_DEFAULT)->EnableWindow(fEnable);
	GetDlgItem(IDC_RTR_ATLK_S_DEF)->EnableWindow(fEnable);
	GetDlgItem(IDC_BTN_ATLK_ZONEADD)->EnableWindow(fEnable);
	GetDlgItem(IDC_BTN_ATLK_GETZONES)->EnableWindow(fEnable);

	if ( fEnable )
		EnableZoneCtrls();
	else
	{
		GetDlgItem(IDC_BTN_ATLK_ZONEREMOVE)->EnableWindow(false);
	}

}



//***********************************************************************
//	Apple talk property sheet
//***********************************************************************
CATLKPropertySheet::CATLKPropertySheet(ITFSNode *pNode,
									   IComponentData *pComponentData,
									   ITFSComponentData *pTFSCompData,
									   LPCTSTR pszSheetName,
									   CWnd *pParent,
									   UINT iPage,
									   BOOL fScopePane)
: RtrPropertySheet(pNode, pComponentData, pTFSCompData,
				   pszSheetName, pParent, iPage, fScopePane),
m_pageGeneral(IDD_RTR_ATLK)
{
	m_spNode.Set(pNode);
}

/*!--------------------------------------------------------------------------
	CATLKPropertySheet::Init
		Initialize the property sheets.  The general action here will be
		to initialize/add the various pages.
	Author: KennT
 ---------------------------------------------------------------------------*/
HRESULT CATLKPropertySheet::Init(IInterfaceInfo *pIf)
{
	Assert(pIf);
	HRESULT hr = hrOK;

	m_spIf.Set(pIf);

	// The pages are embedded members of the class
	// do not delete them.
	m_bAutoDeletePages = FALSE;

	   //winsock on adapter only
	m_atlkEnv.SetFlags(CATLKEnv::ATLK_ONLY_ONADAPTER);
	   
	   //load up container of adapters names
	m_atlkEnv.FetchRegInit();
	   
	   //find this adapterinfo in the container
	CString sz=m_spIf->GetId(); 
	CAdapterInfo* p = m_atlkEnv.FindAdapter(sz);
	Assert(p);
	if (p==NULL)
	{
	   TRACE1("The adapter GUID %s was not found in appletalk\\parameters\\adapters key", sz);
	   goto Error;
	}
	
	   //add general appletalk page
	m_pageGeneral.Init(this, p);
	AddPageToList((CPropertyPageBase*) &m_pageGeneral);

Error:
	return hr;
}


/*!--------------------------------------------------------------------------
	CATLKPropertySheet::SaveSheetData
		-
	Author: KennT
 ---------------------------------------------------------------------------*/
BOOL CATLKPropertySheet::SaveSheetData()
{
	Assert(m_spIf);

	HRESULT	hr = m_atlkEnv.SetAdapterInfo();

	if ( FHrFailed(hr) )
	{
		DisplayIdErrorMessage2(NULL, IDS_ERR_ATLK_CONFIG, hr);
	}

   SPITFSNode  spParent;
	SPITFSNodeHandler	spHandler;

	m_spNode->GetParent(&spParent);
	spParent->GetHandler(&spHandler);

	spHandler->OnCommand(spParent,
						 IDS_MENU_REFRESH,
						 CCT_RESULT, NULL, 0);

	return TRUE;	return TRUE;
}




/////////////////////////////////////////////////////////////////////////////
// CEditNewZoneDialog dialog
//
// Author: NSun

CEditNewZoneDialog::CEditNewZoneDialog(CWnd* pParent /*=NULL*/)
	: CDialog(CEditNewZoneDialog::IDD, pParent)
{
	//{{AFX_DATA_INIT(CEditNewZoneDialog)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CEditNewZoneDialog::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CEditNewZoneDialog)
	DDX_Control(pDX, IDC_RTR_ATLK_NEWZONE_EDIT, m_editZone);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CEditNewZoneDialog, CDialog)
	//{{AFX_MSG_MAP(CEditNewZoneDialog)
		// NOTE: the ClassWizard will add message map macros here
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/*!----------------------------------------------------------------------------
	CEditNewZoneDialog::GetZone
		-
	Author: NSun
 ------------------------------------------------------------------------------*/
void CEditNewZoneDialog::GetZone(OUT CString& stZone)
{
	stZone = m_stZone;
}

BOOL CEditNewZoneDialog::OnInitDialog()
{
	CDialog::OnInitDialog();
	m_editZone.SetFocus();

	return FALSE;
}

void CEditNewZoneDialog::OnOK()
{
	CString st;
	m_editZone.GetWindowText(st);
	
	if(st.IsEmpty())
	{
		AfxMessageBox(IDS_ERR_ATLK_EMPTY_ZONE);
		return;
	}

	m_stZone = st;
	CDialog::OnOK();
}

void CEditNewZoneDialog::OnCancel() 
{
	CDialog::OnCancel();
}