//	**************************************************************************************
//	File:			Krb4DomainRealmMaintenance.cpp 
//	By:				Arthur David Leather
//	Created:		12/02/98
//	Copyright		@1998 Massachusetts Institute of Technology - All rights reserved.
//	Description:	CPP file for Krb4DomainRealmMaintenance.h. Contains variables and functions 
//					for Kerberos Four Properties
//
//	History:
//
//	MM/DD/YY	Inits	Description of Change
//	12/02/98	ADL		Original
//	**************************************************************************************

#include "stdafx.h"
#include "leash.h"
#include "KrbProperties.h"
#include "Krb4Properties.h"
#include "Krb4AddToDomainRealmList.h"
#include "Krb4EditDomainRealmList.h" 
#include "Krb4DomainRealmMaintenance.h"
#include "lglobals.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CKrb4DomainRealmMaintenance dialog


IMPLEMENT_DYNCREATE(CKrb4DomainRealmMaintenance, CPropertyPage)

CKrb4DomainRealmMaintenance::CKrb4DomainRealmMaintenance() : 
  CPropertyPage(CKrb4DomainRealmMaintenance ::IDD)
{
	m_defectiveLines = 0;
}

CKrb4DomainRealmMaintenance::~CKrb4DomainRealmMaintenance()
{
}

void CKrb4DomainRealmMaintenance::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CKrb4DomainRealmMaintenance)
	DDX_Control(pDX, IDC_LIST_DOMAINREALM, m_realmDomainList);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CKrb4DomainRealmMaintenance, CPropertyPage)
	//{{AFX_MSG_MAP(CKrb4DomainRealmMaintenance)
	ON_BN_CLICKED(IDC_BUTTON_REALM_HOST_ADD, OnButtonRealmHostAdd)
	ON_BN_CLICKED(ID_BUTTON_REALM_HOST_REMOVE, OnButtonRealmHostRemove)
	ON_BN_CLICKED(IDC_BUTTON_REALM_HOST_EDIT, OnButtonRealmHostEdit)
	ON_LBN_SELCHANGE(IDC_LIST_DOMAINREALM, OnSelchangeListDomainrealm)
	ON_LBN_DBLCLK(IDC_LIST_DOMAINREALM, OnDblclkListDomainrealm)
	ON_BN_CLICKED(IDC_BUTTON_HOSTMAINT_HELP, OnButtonHostmaintHelp)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CKrb4DomainRealmMaintenance message handlers

BOOL CKrb4DomainRealmMaintenance::OnApply()
{
	CStdioFile krbrealmCon;
	if (!krbrealmCon.Open(CKrbProperties::m_krbrealmPath, CFile::modeCreate |
														  CFile::modeNoTruncate |
														  CFile::modeReadWrite)) 
	{	
		LeashErrorBox("OnApply::Can't open Configuration File", 
					  CKrbProperties::m_krbrealmPath);
		return TRUE;
	}

	memset(lineBuf, '\0', sizeof(lineBuf));
	krbrealmCon.SetLength(0);
	krbrealmCon.WriteString(lineBuf);
	for (INT maxItems = m_realmDomainList.GetCount(), item = 0; item < maxItems; item++)
	{
		memset(lineBuf, '\0', sizeof(lineBuf));
		if (!m_realmDomainList.GetText(item, lineBuf))
          break;
			
		krbrealmCon.WriteString(lineBuf);
		krbrealmCon.WriteString("\n");
	}

	krbrealmCon.Close();
  
	return TRUE;
}

BOOL CKrb4DomainRealmMaintenance::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();
	CStdioFile krbrealmCon;	
	
	if (!krbrealmCon.Open(CKrbProperties::m_krbrealmPath, CFile::modeReadWrite)) 
	{ // can't find file, so lets set some defaults	
		CString defaultStr;
		defaultStr.Format("%s %s", "MIT.EDU", KRB_REALM);
		m_realmDomainList.AddString(defaultStr);
	}
	else
	{
		while (TRUE)
		{
			if (!krbrealmCon.ReadString(lineBuf, sizeof(lineBuf)))
			  break;
				
			*(lineBuf + strlen(lineBuf) - 1) = 0;
			
			if (!strchr(lineBuf, ' ') && !strchr(lineBuf, '\t'))
			{ // found a defective line
				m_defectiveLines++; 
			}
						
			if (LB_ERR == m_realmDomainList.AddString(lineBuf))
			{
				LeashErrorBox("OnInitDialog::Can't read Configuration File", 
							  CKrbProperties::m_krbrealmPath);
				krbrealmCon.Close();	
				return FALSE;
			}
		}
	
		krbrealmCon.Close();	
	}

	m_realmDomainList.SetCurSel(0);

	if (!m_realmDomainList.GetCount())
	{
		GetDlgItem(ID_BUTTON_REALM_HOST_REMOVE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BUTTON_REALM_HOST_EDIT)->EnableWindow(FALSE);
	}

	return TRUE;  
}

void CKrb4DomainRealmMaintenance::OnButtonRealmHostAdd() 
{
	CKrb4AddToDomainRealmList addToDomainRealmList;
	if (IDOK == addToDomainRealmList.DoModal())
	{
		if (addToDomainRealmList.GetNewRealm().IsEmpty())
		  ASSERT(0);

		CString newLine;
		newLine = addToDomainRealmList.GetNewDomainHost() + " " + addToDomainRealmList.GetNewRealm();  			
	    
		// We don't want duplicate items in Listbox
		CString ckDups;
		for (INT item = 0; item < m_realmDomainList.GetCount(); item++)
		{
			m_realmDomainList.GetText(item, ckDups);
			if (0 == ckDups.CompareNoCase(newLine))
			{ // found duplicate item in Listbox 
				LeashErrorBox("OnButtonRealmHostAdd::Found a Duplicate Item\nCan't add to List",
							  ckDups);					
				return;
			}
		}

		m_realmDomainList.InsertString(0, newLine);
		m_realmDomainList.SetCurSel(0); 
		SetModified(TRUE);
 
		if (1 == m_realmDomainList.GetCount())
		{
			GetDlgItem(ID_BUTTON_REALM_HOST_REMOVE)->EnableWindow();GetDlgItem(IDC_BUTTON_REALM_HOST_EDIT)->EnableWindow();
		}
	}
}

void CKrb4DomainRealmMaintenance::OnButtonRealmHostRemove() 
{
	if (IDYES != AfxMessageBox("Your about to remove an item from the list!\n\nContinue?",
							   MB_YESNO))
	  return;
	
	INT curSel = m_realmDomainList.GetCurSel();
	m_realmDomainList.DeleteString(curSel);  // Single Sel Listbox		
	
	if (-1 == m_realmDomainList.SetCurSel(curSel))
	  m_realmDomainList.SetCurSel(curSel - 1);
		
	if (!m_realmDomainList.GetCount())
	{
		GetDlgItem(ID_BUTTON_REALM_HOST_REMOVE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BUTTON_REALM_HOST_EDIT)->EnableWindow(FALSE);
	}
	
	SetModified(TRUE);
}

void CKrb4DomainRealmMaintenance::OnButtonRealmHostEdit() 
{
	INT selItemIndex = m_realmDomainList.GetCurSel();
	LPSTR pSelItem = new char[m_realmDomainList.GetTextLen(selItemIndex) + 1];
	if (!pSelItem)
	  ASSERT(0);

	CString selItem; 
	m_realmDomainList.GetText(selItemIndex, selItem);
	strcpy(pSelItem, selItem);

	CKrb4EditDomainRealmList editDomainRealmList(pSelItem);
	delete [] pSelItem;

	if (IDOK == editDomainRealmList.DoModal())
	{
		CString editedItem = editDomainRealmList.GetEditedItem();
		if (0 != selItem.CompareNoCase(editedItem) && 
			LB_ERR != m_realmDomainList.FindStringExact(-1, editedItem)) 
		{
			LeashErrorBox("OnButtonRealmHostEdit::Found a Duplicate!\nCan't add to List",
							  editedItem);					
			
			return;
		}
		
		m_realmDomainList.DeleteString(selItemIndex);
		m_realmDomainList.InsertString(selItemIndex, editDomainRealmList.GetEditedItem());
		m_realmDomainList.SetCurSel(selItemIndex);
		SetModified(TRUE);
	}
}

void CKrb4DomainRealmMaintenance::OnSelchangeListDomainrealm() 
{
	//SetModified(TRUE);		
}

void CKrb4DomainRealmMaintenance::OnDblclkListDomainrealm() 
{
	OnButtonRealmHostEdit(); 
}

BOOL CKrb4DomainRealmMaintenance::PreTranslateMessage(MSG* pMsg) 
{
	if (m_defectiveLines)
	{
		if (m_defectiveLines == 1)
		  LeashErrorBox("Found a defective entry in file", 
						CKrbProperties::m_krbrealmPath, "Warning");
	    else if (m_defectiveLines > 1)
	      LeashErrorBox("Found more then one defective entry in file", 
						CKrbProperties::m_krbrealmPath, "Warning");
	}
	
	m_defectiveLines = 0;
	return CPropertyPage::PreTranslateMessage(pMsg);
}




void CKrb4DomainRealmMaintenance::OnButtonHostmaintHelp() 
{
	MessageBox("No Help Available!", "Leash", MB_OK);	
}
