// advcom1.cpp : implementation file
//

#include "stdafx.h"
#include "afxcmn.h"
#include "ISAdmin.h"
#include "advcom1.h"


#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CADVCOM1 dialog

IMPLEMENT_DYNCREATE(CADVCOM1, CGenPage)

CADVCOM1::CADVCOM1(): CGenPage(CADVCOM1::IDD)
{
	//{{AFX_DATA_INIT(CADVCOM1)
	//}}AFX_DATA_INIT
}

CADVCOM1::~CADVCOM1()
{
}

void CADVCOM1::DoDataExchange(CDataExchange* pDX)
{
	CGenPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CADVCOM1)
	DDX_Control(pDX, IDC_LOGFILEFLUSHINTERVALSPIN1, m_spinLogFileFlushInterval);
	DDX_Control(pDX, IDC_LOGFILEFLUSHINTERVALDATA1, m_editLogFileFlushInterval);
	DDX_Control(pDX, IDC_USELOGFILEFLUSHINTERNVALDATA1, m_cboxUseLogFileFlushInterval);
	DDX_Control(pDX, IDC_USERTOKENTTLSPIN1, m_spinUserTokenTTL);
	DDX_Control(pDX, IDC_USEOBJECTCACHETTLDATA1, m_cboxUseObjCacheTTL);
	DDX_Control(pDX, IDC_OBJCACHEDATA1, m_editObjCacheTTL);
	DDX_Control(pDX, IDC_ACCEPTEXTODATA1, m_editAcceptExTO);
	DDX_Control(pDX, IDC_ACCEPTEXOUTDATA1, m_editAcceptExOut);
	DDX_Control(pDX, IDC_COMDBGFLAGSDATA1, m_editComDbgFlags);
	DDX_Control(pDX, IDC_USEACCEPTEXDATA1, m_cboxUseAcceptEx);
	DDX_Control(pDX, IDC_THREADTOSPIN1, m_spinThreadTO);
	DDX_Control(pDX, IDC_OBJCACHESPIN1, m_spinObjCache);
	DDX_Control(pDX, IDC_MAXPOOLSPIN1, m_spinMaxPool);
	DDX_Control(pDX, IDC_MAXCONCURSPIN1, m_spinMaxConcur);
	DDX_Control(pDX, IDC_ACCEPTEXTOSPIN1, m_spinAcceptExTO);
	DDX_Control(pDX, IDC_ACCEPTEXOUTSPIN1, m_spinAcceptExOut);
	DDX_TexttoHex(pDX, IDC_COMDBGFLAGSDATA1, m_ulComDbgFlags);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CADVCOM1, CGenPage)
	//{{AFX_MSG_MAP(CADVCOM1)
	ON_EN_CHANGE(IDC_ACCEPTEXOUTDATA1, OnChangeAcceptexoutdata1)
	ON_EN_CHANGE(IDC_ACCEPTEXTODATA1, OnChangeAcceptextodata1)
	ON_EN_CHANGE(IDC_MAXCONCURDATA1, OnChangeMaxconcurdata1)
	ON_EN_CHANGE(IDC_MAXPOOLDATA1, OnChangeMaxpooldata1)
	ON_EN_CHANGE(IDC_OBJCACHEDATA1, OnChangeObjcachedata1)
	ON_EN_CHANGE(IDC_THREADTODATA1, OnChangeThreadtodata1)
	ON_BN_CLICKED(IDC_USEACCEPTEXDATA1, OnUseacceptexdata1)
	ON_EN_CHANGE(IDC_COMDBGFLAGSDATA1, OnChangeComdbgflagsdata1)
	ON_BN_CLICKED(IDC_USEOBJECTCACHETTLDATA1, OnUseobjectcachettldata1)
	ON_EN_CHANGE(IDC_USERTOKENTTLDATA1, OnChangeUsertokenttldata1)
	ON_BN_CLICKED(IDC_USELOGFILEFLUSHINTERNVALDATA1, OnUselogfileflushinternvaldata1)
	ON_EN_CHANGE(IDC_LOGFILEFLUSHINTERVALDATA1, OnChangeLogfileflushintervaldata1)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CADVCOM1 message handlers

BOOL CADVCOM1::OnInitDialog() 
{
	int i;
	CGenPage::OnInitDialog();

	for (i = 0; i < AdvComPage_TotalNumRegEntries; i++) {
	   m_binNumericRegistryEntries[i].bIsChanged = FALSE;
	   m_binNumericRegistryEntries[i].ulMultipleFactor = 1;
	   }
	
	m_binNumericRegistryEntries[AdvComPage_MaxPoolThreads].strFieldName = _T(MAXPOOLTHREADSNAME);	
	m_binNumericRegistryEntries[AdvComPage_MaxPoolThreads].ulDefaultValue = DEFAULTMAXPOOLTHREADS;

	m_binNumericRegistryEntries[AdvComPage_MaxConcurrency].strFieldName = _T(MAXCONCURRENCYNAME);	
	m_binNumericRegistryEntries[AdvComPage_MaxConcurrency].ulDefaultValue = DEFAULTMAXCONCURRENCY;

	m_binNumericRegistryEntries[AdvComPage_ThreadTimeout].strFieldName = _T(THREADTIMEOUTNAME);	
	m_binNumericRegistryEntries[AdvComPage_ThreadTimeout].ulDefaultValue = DEFAULTTHREADTIMEOUT;
	m_binNumericRegistryEntries[AdvComPage_ThreadTimeout].ulMultipleFactor = 60;

	m_binNumericRegistryEntries[AdvComPage_UseAcceptEx].strFieldName = _T(USEACCEPTEXNAME);	
	m_binNumericRegistryEntries[AdvComPage_UseAcceptEx].ulDefaultValue = DEFAULTUSEACCEPTEX;

	m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].strFieldName = _T(OBJECTCACHETTLNAME);	
	m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].ulDefaultValue = DEFAULTOBJECTCACHETTL;
	m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].ulMultipleFactor = 60;

	m_binNumericRegistryEntries[AdvComPage_UserTokenTTL].strFieldName = _T(USERTOKENTTLNAME);	
	m_binNumericRegistryEntries[AdvComPage_UserTokenTTL].ulDefaultValue = DEFAULTUSERTOKENTTL;
	m_binNumericRegistryEntries[AdvComPage_UserTokenTTL].ulMultipleFactor = 60;


	m_binNumericRegistryEntries[AdvComPage_AcceptExOutstanding].strFieldName = _T(ACCEPTEXOUTSTANDINGNAME);	
	m_binNumericRegistryEntries[AdvComPage_AcceptExOutstanding].ulDefaultValue = DEFAULTACCEPTEXOUTSTANDING;

	m_binNumericRegistryEntries[AdvComPage_AcceptExTimeout].strFieldName = _T(ACCEPTEXTIMEOUTNAME);	
	m_binNumericRegistryEntries[AdvComPage_AcceptExTimeout].ulDefaultValue = DEFAULTACCEPTEXTIMEOUT;

	m_binNumericRegistryEntries[AdvComPage_LogFileFlushInterval].strFieldName = _T(LOGFILEFLUSHINTERVALNAME);	
	m_binNumericRegistryEntries[AdvComPage_LogFileFlushInterval].ulDefaultValue = DEFAULTLOGFILEFLUSHINTERVAL;
	m_binNumericRegistryEntries[AdvComPage_LogFileFlushInterval].ulMultipleFactor = 60;

	m_binNumericRegistryEntries[AdvComPage_DebugFlags].strFieldName = _T(DEBUGFLAGSNAME);	
	m_binNumericRegistryEntries[AdvComPage_DebugFlags].ulDefaultValue = DEFAULTDEBUGFLAGS;


	for (i = 0; i < AdvComPage_TotalNumRegEntries; i++) {
	   if (m_rkMainKey->QueryValue(m_binNumericRegistryEntries[i].strFieldName, 
	      m_binNumericRegistryEntries[i].ulFieldValue) != ERROR_SUCCESS) {
		  m_binNumericRegistryEntries[i].ulFieldValue = m_binNumericRegistryEntries[i].ulDefaultValue;
	   }
	}
   
	m_spinThreadTO.SetRange(MINTHREADTIMEOUT, MAXTHREADTIMEOUT);
	m_spinThreadTO.SetPos(LESSOROF ((m_binNumericRegistryEntries[AdvComPage_ThreadTimeout].ulFieldValue / 
	   m_binNumericRegistryEntries[AdvComPage_ThreadTimeout].ulMultipleFactor),MAXTHREADTIMEOUT));
	
	m_spinObjCache.SetRange(MINOBJECTCACHETTL, MAXOBJECTCACHETTL);
	if (m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].ulFieldValue != 0xffffffff) {
	   m_spinObjCache.SetPos(LESSOROF ((m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].ulFieldValue / 
	      m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].ulMultipleFactor),MAXOBJECTCACHETTL));
	   SetObjCacheTTLEnabledState(TRUE);
	}
	else {
	   m_spinObjCache.SetPos(LESSOROF ((m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].ulDefaultValue /
  	      m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].ulMultipleFactor),MAXOBJECTCACHETTL));
	   SetObjCacheTTLEnabledState(FALSE);
	}

	m_spinUserTokenTTL.SetRange(MINUSERTOKENTTL, MAXUSERTOKENTTL);
	m_spinUserTokenTTL.SetPos(LESSOROF ((m_binNumericRegistryEntries[AdvComPage_UserTokenTTL].ulFieldValue / 
	   m_binNumericRegistryEntries[AdvComPage_UserTokenTTL].ulMultipleFactor),MAXUSERTOKENTTL));

	m_spinMaxPool.SetRange(MINMAXPOOLTHREADS,MAXMAXPOOLTHREADS);
	m_spinMaxPool.SetPos(LESSOROF ((m_binNumericRegistryEntries[AdvComPage_MaxPoolThreads].ulFieldValue / 
	   m_binNumericRegistryEntries[AdvComPage_MaxPoolThreads].ulMultipleFactor),MAXMAXPOOLTHREADS));
	
	m_spinMaxConcur.SetRange(MINMAXCONCURRENCY, MAXMAXCONCURRENCY);
	m_spinMaxConcur.SetPos(LESSOROF ((m_binNumericRegistryEntries[AdvComPage_MaxConcurrency].ulFieldValue / 
	   m_binNumericRegistryEntries[AdvComPage_MaxConcurrency].ulMultipleFactor), MAXMAXCONCURRENCY));
	
	m_spinAcceptExTO.SetRange(MINACCEPTEXTIMEOUT,MAXACCEPTEXTIMEOUT);
	m_spinAcceptExTO.SetPos(LESSOROF ((m_binNumericRegistryEntries[AdvComPage_AcceptExTimeout].ulFieldValue / 
	   m_binNumericRegistryEntries[AdvComPage_AcceptExTimeout].ulMultipleFactor),MAXACCEPTEXTIMEOUT));
	
	m_spinAcceptExOut.SetRange(MINACCEPTEXOUTSTANDING,MAXACCEPTEXOUTSTANDING);
	m_spinAcceptExOut.SetPos(LESSOROF ((m_binNumericRegistryEntries[AdvComPage_AcceptExOutstanding].ulFieldValue / 
	   m_binNumericRegistryEntries[AdvComPage_AcceptExOutstanding].ulMultipleFactor),MAXACCEPTEXOUTSTANDING));

	m_cboxUseAcceptEx.SetCheck(GETCHECKBOXVALUEFROMREG(m_binNumericRegistryEntries[AdvComPage_UseAcceptEx].ulFieldValue));
	SetAcceptExEnabledState();

	m_spinLogFileFlushInterval.SetRange(MINLOGFILEFLUSHINTERVAL, MAXLOGFILEFLUSHINTERVAL);
	if (m_binNumericRegistryEntries[AdvComPage_LogFileFlushInterval].ulFieldValue != 0xffffffff) {
	   m_spinLogFileFlushInterval.SetPos(LESSOROF ((m_binNumericRegistryEntries[AdvComPage_LogFileFlushInterval].ulFieldValue / 
	      m_binNumericRegistryEntries[AdvComPage_LogFileFlushInterval].ulMultipleFactor),MAXLOGFILEFLUSHINTERVAL));
	   SetLogFileFlushIntervalEnabledState(TRUE);
	}
	else {
	   m_spinObjCache.SetPos(LESSOROF ((m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].ulDefaultValue /
  	      m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].ulMultipleFactor),MAXOBJECTCACHETTL));
	   SetObjCacheTTLEnabledState(FALSE);
	}



	m_editComDbgFlags.LimitText(8);
	m_ulComDbgFlags = m_binNumericRegistryEntries[AdvComPage_DebugFlags].ulFieldValue;
	UpdateData(FALSE);		// Force Edit box(es) to pick up value(s)

	m_bSetChanged = TRUE;	// Any more changes come from the user

	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CADVCOM1::OnChangeAcceptexoutdata1() 
{
	// TODO: Add your control notification handler code here
	if (m_bSetChanged) {
	   m_binNumericRegistryEntries[AdvComPage_AcceptExOutstanding].bIsChanged = TRUE;	
	   m_binNumericRegistryEntries[AdvComPage_AcceptExOutstanding].ulFieldValue = m_spinAcceptExOut.GetPos() 
	      * m_binNumericRegistryEntries[AdvComPage_AcceptExOutstanding].ulMultipleFactor;		

	   m_bIsDirty = TRUE;
	   SetModified(TRUE);
	}
}

void CADVCOM1::OnChangeAcceptextodata1() 
{
	// TODO: Add your control notification handler code here
	if (m_bSetChanged) {
	   m_binNumericRegistryEntries[AdvComPage_AcceptExTimeout].bIsChanged = TRUE;	
	   m_binNumericRegistryEntries[AdvComPage_AcceptExTimeout].ulFieldValue = m_spinAcceptExTO.GetPos() 
	      * m_binNumericRegistryEntries[AdvComPage_AcceptExTimeout].ulMultipleFactor;		

	   m_bIsDirty = TRUE;
	   SetModified(TRUE);
	}
}

void CADVCOM1::OnChangeMaxconcurdata1() 
{
	// TODO: Add your control notification handler code here
	if (m_bSetChanged) {
	   m_binNumericRegistryEntries[AdvComPage_MaxConcurrency].bIsChanged = TRUE;	
	   m_binNumericRegistryEntries[AdvComPage_MaxConcurrency].ulFieldValue = m_spinMaxConcur.GetPos() 
	      * m_binNumericRegistryEntries[AdvComPage_MaxConcurrency].ulMultipleFactor;		

	   m_bIsDirty = TRUE;
	   SetModified(TRUE);
	}
}

void CADVCOM1::OnChangeMaxpooldata1() 
{
	// TODO: Add your control notification handler code here
	if (m_bSetChanged) {
	   m_binNumericRegistryEntries[AdvComPage_MaxPoolThreads].bIsChanged = TRUE;	
	   m_binNumericRegistryEntries[AdvComPage_MaxPoolThreads].ulFieldValue = m_spinMaxPool.GetPos() 
	      * m_binNumericRegistryEntries[AdvComPage_MaxPoolThreads].ulMultipleFactor;		

	   m_bIsDirty = TRUE;
	   SetModified(TRUE);
	}
	
}

void CADVCOM1::OnChangeObjcachedata1() 
{
	// TODO: Add your control notification handler code here
	if (m_bSetChanged) {
	   m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].bIsChanged = TRUE;	
	   m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].ulFieldValue = m_spinObjCache.GetPos() 
	      * m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].ulMultipleFactor;		

	   m_bIsDirty = TRUE;
	   SetModified(TRUE);
	}
}

void CADVCOM1::OnUseobjectcachettldata1() 
{
	// TODO: Add your control notification handler code here
SetObjCacheTTLEnabledState(m_cboxUseObjCacheTTL.GetCheck());
if (m_bSetChanged) {
   m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].bIsChanged = TRUE;	

   m_bIsDirty = TRUE;
   SetModified(TRUE);
   }

}


void CADVCOM1::OnChangeThreadtodata1() 
{
	// TODO: Add your control notification handler code here
	if (m_bSetChanged) {
	   m_binNumericRegistryEntries[AdvComPage_ThreadTimeout].bIsChanged = TRUE;	
	   m_binNumericRegistryEntries[AdvComPage_ThreadTimeout].ulFieldValue = m_spinThreadTO.GetPos() 
	      * m_binNumericRegistryEntries[AdvComPage_ThreadTimeout].ulMultipleFactor;		

	   m_bIsDirty = TRUE;
	   SetModified(TRUE);
	}
}

void CADVCOM1::OnUseacceptexdata1() 
{
	// TODO: Add your control notification handler code here
	SetAcceptExEnabledState();

	if (m_bSetChanged) {
	   m_binNumericRegistryEntries[AdvComPage_UseAcceptEx].bIsChanged = TRUE;
	   
	   m_binNumericRegistryEntries[AdvComPage_UseAcceptEx].ulFieldValue = 
	      GETREGVALUEFROMCHECKBOX(m_cboxUseAcceptEx.GetCheck());

	   m_bIsDirty = TRUE;
	   SetModified(TRUE);
	}
	
}

void CADVCOM1::OnChangeComdbgflagsdata1() 
{
	// TODO: Add your control notification handler code here
	if (m_bSetChanged) {
	   m_binNumericRegistryEntries[AdvComPage_DebugFlags].bIsChanged = TRUE;
	   	   
	   m_bIsDirty = TRUE;
	   SetModified(TRUE);
	}
	
	
}

void CADVCOM1::OnChangeUsertokenttldata1() 
{
	// TODO: Add your control notification handler code here
	if (m_bSetChanged) {
	   m_binNumericRegistryEntries[AdvComPage_UserTokenTTL].bIsChanged = TRUE;	
	   m_binNumericRegistryEntries[AdvComPage_UserTokenTTL].ulFieldValue = m_spinUserTokenTTL.GetPos() 
	      * m_binNumericRegistryEntries[AdvComPage_UserTokenTTL].ulMultipleFactor;		

	   m_bIsDirty = TRUE;
	   SetModified(TRUE);
	}
}


void CADVCOM1::OnUselogfileflushinternvaldata1() 
{
	// TODO: Add your control notification handler code here
SetLogFileFlushIntervalEnabledState(m_cboxUseLogFileFlushInterval.GetCheck());
if (m_bSetChanged) {
   m_binNumericRegistryEntries[AdvComPage_LogFileFlushInterval].bIsChanged = TRUE;	

   m_bIsDirty = TRUE;
   SetModified(TRUE);
   }

}

void CADVCOM1::OnChangeLogfileflushintervaldata1() 
{
	// TODO: Add your control notification handler code here
	if (m_bSetChanged) {
	   m_binNumericRegistryEntries[AdvComPage_LogFileFlushInterval].bIsChanged = TRUE;	
	   m_binNumericRegistryEntries[AdvComPage_LogFileFlushInterval].ulFieldValue = m_spinLogFileFlushInterval.GetPos() 
	      * m_binNumericRegistryEntries[AdvComPage_LogFileFlushInterval].ulMultipleFactor;		

	   m_bIsDirty = TRUE;
	   SetModified(TRUE);
	}
}




//////////////////////////////////////////////////////////////////
// Other routines

void CADVCOM1::SaveInfo()
{

if (m_bIsDirty) {
   m_binNumericRegistryEntries[AdvComPage_DebugFlags].ulFieldValue = m_ulComDbgFlags;

   SaveNumericInfo(m_binNumericRegistryEntries, AdvComPage_TotalNumRegEntries);
}

CGenPage::SaveInfo();

}



void CADVCOM1::SetAcceptExEnabledState()
{
if (m_cboxUseAcceptEx.GetCheck() != 0) {
   m_spinAcceptExTO.EnableWindow(TRUE);
   m_editAcceptExTO.EnableWindow(TRUE);
   m_spinAcceptExOut.EnableWindow(TRUE);
   m_editAcceptExOut.EnableWindow(TRUE);
   if (m_bSetChanged) {		//if user enabled this, make sure there's a value there
	  m_binNumericRegistryEntries[AdvComPage_AcceptExTimeout].bIsChanged = TRUE;	
	  m_binNumericRegistryEntries[AdvComPage_AcceptExOutstanding].bIsChanged = TRUE;	
   }

}
else {
   m_spinAcceptExTO.EnableWindow(FALSE);
   m_editAcceptExTO.EnableWindow(FALSE);
   m_spinAcceptExOut.EnableWindow(FALSE);
   m_editAcceptExOut.EnableWindow(FALSE);
}
}

void CADVCOM1::SetObjCacheTTLEnabledState(BOOL bEnabled)
{
	if (bEnabled) {
	   m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].ulFieldValue = 
	      m_spinObjCache.GetPos() * 
	      m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].ulMultipleFactor;
	   m_cboxUseObjCacheTTL.SetCheck(CHECKEDVALUE);
	   m_spinObjCache.EnableWindow(TRUE);
	   m_editObjCacheTTL.EnableWindow(TRUE);
	}
	else {
	   m_binNumericRegistryEntries[AdvComPage_ObjectCacheTTL].ulFieldValue = 0xffffffff;
	   m_cboxUseObjCacheTTL.SetCheck(UNCHECKEDVALUE);
	   m_spinObjCache.EnableWindow(FALSE);
	   m_editObjCacheTTL.EnableWindow(FALSE);
	}
}	

void CADVCOM1::SetLogFileFlushIntervalEnabledState(BOOL bEnabled)
{
	if (bEnabled) {
	   m_binNumericRegistryEntries[AdvComPage_LogFileFlushInterval].ulFieldValue = 
	      m_spinLogFileFlushInterval.GetPos() * 
	      m_binNumericRegistryEntries[AdvComPage_LogFileFlushInterval].ulMultipleFactor;
	   m_cboxUseLogFileFlushInterval.SetCheck(CHECKEDVALUE);
	   m_spinLogFileFlushInterval.EnableWindow(TRUE);
	   m_editLogFileFlushInterval.EnableWindow(TRUE);
	}
	else {
	   m_binNumericRegistryEntries[AdvComPage_LogFileFlushInterval].ulFieldValue = 0xffffffff;
	   m_cboxUseLogFileFlushInterval.SetCheck(UNCHECKEDVALUE);
	   m_spinLogFileFlushInterval.EnableWindow(FALSE);
	   m_editLogFileFlushInterval.EnableWindow(FALSE);
	}
}