Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1316 lines
33 KiB

/**********************************************************************/
/** Microsoft Windows NT **/
/** Copyright(c) Microsoft Corp., 1991 **/
/**********************************************************************/
/*
SCOPESDL.CPP
Scopes dialog listbox (right pane containing listbox items)
FILE HISTORY:
10-Nov-96 t-danmo Added comments to existing file.
*/
#include "stdafx.h"
#include "dhcpsrvd.h"
#include "dhcpscop.h"
#include "dhcpleas.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CScopesDlg
//
// This dialog contains a listbox of scopes found in the right-pane.
// It not a *regular* dialog displaying scope properties.
//
IMPLEMENT_DYNCREATE(CScopesDlg, CFormView)
CScopesDlg::CScopesDlg()
: CFormView(CScopesDlg::IDD),
m_ListBoxResScopes(
IDB_SCOPES,
m_list_scopes.nBitmaps
),
m_pHostName(NULL),
m_p_scope(NULL),
m_lastSelTime(0L),
m_liVersion(CHostName::liBadVersion)
{
#ifdef _DEBUG
static int s_cRefCount = 0;
ASSERT(s_cRefCount++ == 0); // Only one instance of the object is allowed
#endif
//{{AFX_DATA_INIT(CScopesDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_list_scopes.AttachResources( &m_ListBoxResScopes );
}
CScopesDlg::~CScopesDlg()
{
}
void
CScopesDlg::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CScopesDlg)
//}}AFX_DATA_MAP
DDX_Control(pDX, IDC_LIST_SCOPES, m_list_scopes);
DDX_Control(pDX, IDC_STATIC_TITLE_SCOPES, m_mtTitle);
}
BEGIN_MESSAGE_MAP(CScopesDlg, CFormView)
//{{AFX_MSG_MAP(CScopesDlg)
ON_LBN_DBLCLK(IDC_LIST_SCOPES, OnDblclkListScopes)
ON_LBN_ERRSPACE(IDC_LIST_SCOPES, OnErrspaceListScopes)
ON_LBN_SELCHANGE(IDC_LIST_SCOPES, OnSelchangeListScopes)
ON_WM_SIZE()
ON_WM_VKEYTOITEM()
ON_WM_SYSCOLORCHANGE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//
// Override the equivalent to OnInitDialog();
//
void
CScopesDlg::OnInitialUpdate ()
{
//
// Invoke the magic DDX process
//
CFormView::OnInitialUpdate();
//m_list_scopes.SubclassDlgItem(IDC_LIST_SCOPES, this);
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
//CString str;
//m_static_title_scopes.GetWindowText(str);
//m_mtTitle.SetWindowText(str);
//
// Load the persistent information from the Registry.
//
theApp.UpdateStatusBarHost() ;
theApp.LoadHostsList() ;
FillListbox( NULL, FALSE ) ;
theApp.UpdateStatusBar() ;
// No selection initially in the scopes list.
m_list_scopes.SetCurSel(-1);
} // CScopesDlg::OnInitialUpdate()
/////////////////////////////////////////////////////////////////////
// Return a pointer to the selected host in the listbox.
// If the selected item is a scope or the host is not opened,
// the routine will return NULL.
CHostName *
CScopesDlg::QueryCurrentSelectedHost(OUT OPTIONAL int * piCurSel)
{
int iCurSel = m_list_scopes.GetCurSel();
if (iCurSel == LB_ERR)
return NULL;
CLBScope * p = (CLBScope *)m_list_scopes.GetItemDataPtr(iCurSel);
if (p == NULL || (int)p == -1)
{
ASSERT(FALSE);
return NULL;
}
if (p->IsScope() || !p->IsOpen())
return NULL;
if (piCurSel != NULL)
*piCurSel = iCurSel;
return p->QueryHostName();
} // CScopesDlg::QueryCurrentSelectedHost()
/////////////////////////////////////////////////////////////////////
// Given the index of the current selection (which is assumed to be a scope),
// find the index of the host that it belongs to by checking back in the
// listbox
//
int
CScopesDlg::FindHostIndex(
int nCurSel
)
{
ASSERT(nCurSel > 0);
ASSERT(((CLBScope *)m_list_scopes.GetItemDataPtr(nCurSel))->IsScope());
int n = nCurSel;
CLBScope * pHost = NULL;
do
{
--n;
ASSERT(n >= 0);
pHost = (CLBScope *)m_list_scopes.GetItemDataPtr(n);
ASSERT(pHost != NULL);
}
while (n >= 0 && pHost->IsScope());
ASSERT(n >= 0);
ASSERT(pHost->IsOpen());
return(n);
}
BOOL
CScopesDlg::FillListbox (
CDhcpScope * pdhcScopeFocus, // Scope to get focus or NULL
BOOL bToggleRedraw // TRUE if redraw should be controlled during refill
)
{
APIERR err = 0 ;
//
// First, turn off redraw.
//
if ( bToggleRedraw )
{
m_list_scopes.SetRedraw( FALSE ) ;
}
CHostName * pobHost = NULL ;
CObListIter obliHosts( theApp.QueryHostsList() ) ;
int cItems = 0,
iFocus,
nIndex = -1 ;
CATCH_MEM_EXCEPTION
{
//
// Refill the Scopes list box.
//
m_list_scopes.ResetContent() ;
for ( iFocus = cItems = 0 ;
pobHost = (CHostName *) obliHosts.Next() ;
cItems++ )
{
CLBScope * pScope = new CLBScope(
FALSE,
pobHost
);
nIndex = m_list_scopes.AddString((LPCSTR)pScope );
ASSERT(nIndex != LB_ERR);
}
}
END_MEM_EXCEPTION(err)
m_list_scopes.SetCurSel( cItems == 0 ? -1 : iFocus ) ;
if ( bToggleRedraw )
{
//
// Then, turn re-draw back on.
//
m_list_scopes.SetRedraw( TRUE ) ;
m_list_scopes.Invalidate() ;
}
//
// Throw focus to the scopes list box
//
m_list_scopes.SetFocus() ;
if ( err )
{
theApp.MessageBox( err ) ;
}
return err == 0 ;
}
//
// Initialise the list of scopes if not
// previously initialised.
//
APIERR
CScopesDlg::InitialiseScopes(
CHostName * pHost,
CObOwnedList ** pp_obl_scopes
)
{
ASSERT(pp_obl_scopes != NULL);
APIERR err = 0;
//
// Only do something if we didn't already have the scopes list
// loaded.
//
if (*pp_obl_scopes == NULL)
{
//
// Virginal scopes list -- try to connect to the server
//
*pp_obl_scopes = new CObOwnedList;
if ( (err = (*pp_obl_scopes)->QueryError()) != ERROR_SUCCESS)
{
return err ;
}
CDhcpScope * pobScope = NULL ;
CDhcpEnumScopeElements * pEnumElem = NULL ;
const DHCP_SUBNET_INFO * pdhcSubnetInfo ;
CATCH_MEM_EXCEPTION
{
//
// Create an enumerator for the sub-nets covered by this host server
// The enumerator cannot be constructed on the stack due to
// exception handling problems.
//
theApp.UpdateStatusBar( IDS_STATUS_GETTING_HOST_INFO ) ;
theApp.BeginWaitCursor();
pEnumElem = new CDhcpEnumScopeElements( *pHost ) ;
if ( (err = pEnumElem->QueryError()) == ERROR_SUCCESS )
{
while (pEnumElem->Next()
&& (pdhcSubnetInfo = pEnumElem->QueryScopeInfo()) )
{
pobScope = new CDhcpScope( *pHost, pdhcSubnetInfo ) ;
if ( err = pobScope->QueryError() )
{
break;
}
if ( err = theApp.AddScope( pobScope, **pp_obl_scopes ) )
{
break;
}
pobScope = NULL ;
}
}
theApp.EndWaitCursor();
theApp.UpdateStatusBar() ;
if (err == ERROR_SUCCESS)
{
err = pEnumElem->QueryApiErr();
}
//
// Delete the enumerator.
//
delete pEnumElem ;
}
END_MEM_EXCEPTION(err)
theApp.SortScopesList( **pp_obl_scopes) ;
}
return err;
}
APIERR
CScopesDlg::CloseHost(
int nCurSel,
BOOL fRefresh
)
{
ASSERT(nCurSel != LB_ERR);
CLBScope * p = (CLBScope *)m_list_scopes.GetItemDataPtr(nCurSel);
// BUG: GetItemDataPtr() returns -1 on error
ASSERT((int)p != -1);
ASSERT(p != NULL);
ASSERT(!p->IsScope());
ASSERT(p->IsOpen());
//
// Was open, now close:
//
p->SetOpenFlag(FALSE);
//
// Remove its scopes:
//
int n = nCurSel + 1;
int nCount = m_list_scopes.GetCount();
while (n < nCount)
{
CLBScope * pScope =
(CLBScope *)m_list_scopes.GetItemDataPtr(n);
ASSERT(pScope != NULL);
if (!pScope->IsScope())
{
//
// Not a scope, so stop deleting strings
//
break;
}
nCount = m_list_scopes.DeleteString(n);
ASSERT(nCount != LB_ERR);
}
//
// Force scopes list to be re-initialised
// next time the thing is opened
//
if (fRefresh)
{
delete p->GetScopePtr();
p->GetScopePtr() = NULL;
}
return ERROR_SUCCESS;
}
APIERR
CScopesDlg::OpenHost(
int nCurSel
)
{
ASSERT(nCurSel != LB_ERR);
CLBScope * p = (CLBScope *)m_list_scopes.GetItemDataPtr(nCurSel);
ASSERT(p != NULL);
ASSERT(!p->IsScope());
ASSERT(!p->IsOpen());
CLBScope * pScope = NULL;
CObOwnedList * p_obl_scopes = p->GetScopePtr();
ASSERT(p_obl_scopes != NULL);
p->SetOpenFlag(TRUE);
CDhcpScope * pobScope = NULL ;
CObListIter obliScopes( *p_obl_scopes ) ;
int cScopes,
nIndex = -1 ;
APIERR err = 0;
CATCH_MEM_EXCEPTION
{
for ( cScopes = 0 ;
pobScope = (CDhcpScope *) obliScopes.Next() ;
cScopes++ )
{
pScope = new CLBScope(
FALSE,
pobScope->QueryEnabled(),
pobScope
);
nIndex = m_list_scopes.InsertString(nCurSel + 1 + cScopes, (LPCSTR)pScope );
ASSERT(nIndex != LB_ERR);
}
}
END_MEM_EXCEPTION(err)
if (err != ERROR_SUCCESS)
{
return err;
}
//
// Now change the flag of the last scope added.
//
if (nIndex != -1)
{
CLBScope * p = (CLBScope *)m_list_scopes.GetItemDataPtr(nIndex);
p->SetLastFlag(TRUE);
}
::time(&m_lastSelTime);
return ERROR_SUCCESS;
}
void
CScopesDlg::AddHost()
{
LONG err = 0 ;
CDhcpSrvDlg dlgServer;
if ( dlgServer.DoModal() == IDOK )
{
//
// We managed to add a host, so now add it to the listbox
//
int nIndex;
CHostName * pobHost = dlgServer.QueryHostName();
ASSERT(pobHost != NULL);
CLBScope * pScope = new CLBScope(
FALSE,
pobHost
);
nIndex = m_list_scopes.AddString((LPCSTR)pScope );
ASSERT(nIndex != LB_ERR);
m_list_scopes.SetCurSel(nIndex);
ChangeSelectedScope(nIndex); // Try to connect to it...
}
}
APIERR
CScopesDlg::DeleteHost(
int nCurSel
)
{
CLBScope * p = NULL;
APIERR err;
ASSERT(nCurSel != LB_ERR);
p = (CLBScope *)m_list_scopes.GetItemDataPtr(nCurSel);
// BUG! GetItemDataPtr() returns -1 on error
ASSERT((long)p != -1);
ASSERT(p != NULL);
ASSERT(p != NULL && !p->IsScope());
if ((long)p == -1 || p == NULL)
{
TRACEEOLID("CScopesDlg::DeleteHost() : p != -1 || p == NULL" );
return ERROR_SUCCESS;
}
if (p->IsOpen())
{
m_list_scopes.SetRedraw(FALSE);
CloseHost(nCurSel, TRUE);
m_list_scopes.SetRedraw(TRUE);
m_list_scopes.Invalidate() ;
}
err = theApp.RemoveHost ( p->QueryHostName() );
if (err != ERROR_SUCCESS)
{
return err;
}
int cItemsLeft = m_list_scopes.DeleteString(nCurSel);
// ChangeSelectedScope(cItemsLeft - 1);
return ERROR_SUCCESS;
}
//
// return index of currently selected host, or LB_ERR if
// there is no current selection, or the current selection
// is a scope.
//
int
CScopesDlg::GetSelectedHostIndex()
{
int nCurSel = m_list_scopes.GetCurSel();
CLBScope * p = NULL;
if (nCurSel != LB_ERR)
{
p = (CLBScope *)m_list_scopes.GetItemDataPtr(nCurSel);
}
return (p && !p->IsScope() ? nCurSel : LB_ERR);
}
void CScopesDlg::DeleteCurrentHost()
{
int nCurSel = GetSelectedHostIndex();
if (nCurSel == LB_ERR)
{
return;
}
CLBScope * p = (CLBScope *)m_list_scopes.GetItemDataPtr(nCurSel);
ASSERT( p != NULL && !p->IsScope());
CHAR szMsg[1000];
CString strMsg;
if (strMsg.LoadString(IDS_WRN_DISCONNECT))
{
::wsprintf(szMsg, strMsg, p->QueryString() );
if (::AfxMessageBox(szMsg, MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION) != IDYES)
{
return;
}
}
else
{
TRACEEOLID("Error loading warning message from resource" );
}
APIERR err = DeleteHost(nCurSel);
if (err != ERROR_SUCCESS)
{
theApp.MessageBox(err);
}
}
void
CScopesDlg::AddClient()
{
CDhcpClientInfoDlg dlgClientInfo(
QueryCurrentScope(),
NULL) ;
dlgClientInfo.DoModal();
}
void
CScopesDlg::ToggleCurrentScopeActivationState()
{
int nCurSel = m_list_scopes.GetCurSel();
if (nCurSel == LB_ERR)
{
return;
}
CLBScope * p = (CLBScope *)m_list_scopes.GetItemDataPtr(nCurSel);
ASSERT(p != NULL && p->IsScope());
LONG err = 0 ;
theApp.BeginWaitCursor();
CDhcpScope * pdhcScope = p->QueryDhcpScope();
ASSERT(pdhcScope != NULL);
pdhcScope->SetEnabled( ! pdhcScope->QueryEnabled() ) ;
pdhcScope->SetDirty() ;
err = pdhcScope->Update();
theApp.EndWaitCursor();
if ( err != ERROR_SUCCESS )
{
theApp.MessageBox( err ) ;
}
else
{
//
// BUGBUG: This flag shouldn't be necc.
//
p->SetEnabledFlag(pdhcScope->QueryEnabled());
//
// Redraw, since the activation state has changed
//
RECT rc;
m_list_scopes.GetItemRect(nCurSel, &rc);
m_list_scopes.InvalidateRect(&rc, FALSE);
theApp.UpdateStatusBarScope(!p->IsEnabled());
}
}
int CScopesDlg::FindScope(CDhcpScope * pFind)
{
int n = 0;
ASSERT(pFind);
while (n < m_list_scopes.GetCount())
{
CLBScope * p = (CLBScope *)m_list_scopes.GetItemDataPtr(n);
ASSERT((int)p != -1);
ASSERT(p != NULL);
if (p->IsScope() && *pFind == *(p->QueryDhcpScope()))
{
return n;
}
++n;
}
return LB_ERR;
}
// Show the scope properties dialog
void
CScopesDlg::ShowScope()
{
int nCurSel = m_list_scopes.GetCurSel();
CLBScope * p = (CLBScope *)m_list_scopes.GetItemDataPtr(nCurSel);
if ((long)p == -1 || p == NULL)
{
TRACEEOLID("CScopesDlg::ShowScope() : p != -1 || p == NULL" );
return;
}
CDhcpScope * pScope = p->QueryDhcpScope();
ASSERT(pScope != NULL);
//
// Check option 51 -- the lease duration
//
LONG lDuration = 0;
DHCP_OPTION_VALUE * poptValue;
APIERR err = pScope->GetValue (
51, // BUGBUG: Magic number!
DhcpSubnetOptions,
&poptValue);
if (err != ERROR_SUCCESS)
{
TRACEEOLID("couldn't get lease duration -- this scope may have been created by a pre-release version of the admin tool");
//
// The scope doesn't have a lease duration, maybe there's
// a global option that can come to the rescue here...
//
if ((err = pScope->GetValue (
51,
DhcpGlobalOptions,
&poptValue)) != ERROR_SUCCESS)
{
TRACEEOLID("No global lease duration either -- assuming permanent lease duration");
lDuration = 0;
}
}
if (err == ERROR_SUCCESS)
{
lDuration = poptValue->Value.Elements->Element.DWordOption;
}
CDhcpScopePropDlg dlgScopeProp( pScope, lDuration, this ) ;
if ( dlgScopeProp.DoModal() == IDOK )
{
LONG lNewDuration = dlgScopeProp.GetLeaseDuration();
if (lNewDuration != lDuration)
{
//
// Set lease duration (option 51)
//
CDhcpParamType type (51, DhcpDWordOption , "", "");
type.QueryValue().SetNumber(lNewDuration);
APIERR err = pScope->SetValue(&type, DhcpSubnetOptions);
}
//
// Re-display in case the name has changed
//
RECT rc;
m_list_scopes.GetItemRect(nCurSel, &rc);
m_list_scopes.InvalidateRect(&rc, FALSE);
}
}
void
CScopesDlg::CreateScope()
{
int nCurSel;
int nHost = LB_ERR; // Index of the owning host;
CLBScope * p;
nCurSel = m_list_scopes.GetCurSel();
ASSERT (nCurSel >= 0);
p = (CLBScope *)m_list_scopes.GetItemDataPtr(nCurSel);
ASSERT((int)p != -1);
ASSERT(p != NULL); // Must have a selection to add a new scope
BOOL fTmpScopeList = FALSE;
if ((long)p == -1 || p == NULL)
{
TRACEEOLID("CScopesDlg::CreateScope() : p != -1 || p == NULL" );
return;
}
if (p->IsScope())
{
nHost = FindHostIndex(nCurSel);
ASSERT(nHost != LB_ERR);
p = (CLBScope *)m_list_scopes.GetItemDataPtr(nHost);
ASSERT((int)p != -1);
ASSERT(p != NULL);
}
else
{
nHost = nCurSel;
CObOwnedList * p_obl_scopes = p->GetScopePtr();
//
// If the currently selected host has not had its
// scope list initialised, create a temporary
// scope list for it for the purposes of this
// scope creation, which we'll delete later.
//
if (p_obl_scopes == NULL)
{
APIERR err = InitialiseScopes(
p->QueryHostName(),
&p_obl_scopes
);
if (err != ERROR_SUCCESS)
{
theApp.MessageBox(err);
return;
}
fTmpScopeList = TRUE;
p->GetScopePtr() = p_obl_scopes;
}
}
CObOwnedList * p_obl_scopes = p->GetScopePtr();
ASSERT(p_obl_scopes != NULL);
CDhcpScopePropDlg dlgScopeProp(
p->QueryHostName(), // Owner of the host to be created
p->GetScopePtr(), // Scopes owned by the current host
3 * 24 * 3600, // 3 days even as a default. ???
this
) ;
if ( dlgScopeProp.DoModal() == IDOK )
{
CDhcpScope * pFind = dlgScopeProp.QueryScope();
ASSERT(pFind != NULL);
//
// Create lease duration (option 51)
//
CDhcpParamType type (51, DhcpDWordOption , "", "");
type.QueryValue().SetNumber((INT)dlgScopeProp.GetLeaseDuration());
APIERR err = pFind->SetValue(&type, DhcpSubnetOptions);
//
// Did we use a temporary scope list?
// Dispose of it, if so.
//
if (fTmpScopeList)
{
delete p->GetScopePtr();
p->GetScopePtr() = NULL;
}
if (err != ERROR_SUCCESS)
{
theApp.MessageBox(err);
}
//
// Add Scope to the listbox, if the owning host is currently open.
//
if (p->IsOpen())
{
m_list_scopes.SetRedraw(FALSE);
CloseHost(nHost, FALSE);
OpenHost(nHost);
m_list_scopes.SetRedraw(TRUE);
m_list_scopes.Invalidate() ;
int n = FindScope(pFind);
ASSERT(n != LB_ERR);
m_list_scopes.SetCurSel(n);
ChangeSelectedScope(n);
}
}
}
void
CScopesDlg::DeleteCurrentScope()
{
int nCurSel = m_list_scopes.GetCurSel();
if (nCurSel == LB_ERR)
{
return;
}
int nHost = LB_ERR;
CLBScope * p = (CLBScope *)m_list_scopes.GetItemDataPtr(nCurSel);
ASSERT((int)p != -1);
ASSERT(p != NULL && p->IsScope());
BOOL fAbortDelete = FALSE;
BOOL fDeactivated = FALSE;
LONG err = 0 ;
if (theApp.MessageBox (p->QueryDhcpScope()->QueryEnabled()
? IDS_MSG_DELETE_ACTIVE : IDS_MSG_DELETE_SCOPE,
MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION) == IDYES)
{
CDhcpScope * pdhcScope = p->QueryDhcpScope() ;
ASSERT( pdhcScope != NULL ) ; // Should be disabled if no current scope
if ( pdhcScope == NULL )
{
return ;
}
theApp.BeginWaitCursor();
//
// We do permit the deleting of active scopes, but
// they do have to be disabled first.
//
if (pdhcScope->QueryEnabled())
{
pdhcScope->SetEnabled(FALSE) ;
pdhcScope->SetDirty() ;
pdhcScope->Update();
fDeactivated = TRUE;
}
//
// First try without forcing
//
err = pdhcScope->DeleteSubnet(FALSE); // Force = FALSE
theApp.EndWaitCursor();
if (err == ERROR_FILE_NOT_FOUND)
{
//
// Someone else already deleted this scope.
// This is not a serious error.
//
theApp.MessageBox(IDS_MSG_ALREADY_DELETED, MB_ICONINFORMATION);
err = ERROR_SUCCESS;
}
if (err != ERROR_SUCCESS)
{
//
// Give them a second shot
//
if (theApp.MessageBox (IDS_MSG_DELETE_SCOPE_FORCE,
MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION) == IDYES)
{
theApp.BeginWaitCursor();
err = pdhcScope->DeleteSubnet(TRUE); // Force = TRUE
theApp.EndWaitCursor();
if (err == ERROR_FILE_NOT_FOUND)
{
err = ERROR_SUCCESS;
}
}
else
{
//
// We don't want to delete the active scope.
//
fAbortDelete = TRUE;
}
}
if (err == ERROR_SUCCESS)
{
int nHost = FindHostIndex(nCurSel);
ASSERT(nHost != LB_ERR);
CLBScope * pHost = (CLBScope *)m_list_scopes.GetItemDataPtr(nHost);
ASSERT((int)pHost != -1);
ASSERT(pHost != NULL);
CObOwnedList * p_obl_scopes = pHost->GetScopePtr();
err = theApp.RemoveScope (
pdhcScope,
*p_obl_scopes
);
m_list_scopes.SetRedraw(FALSE);
CloseHost(nHost, FALSE);
OpenHost(nHost);
m_list_scopes.SetRedraw(TRUE);
m_list_scopes.Invalidate() ;
OnSelchangeListScopes();
}
else
{
//
// If we got here because we aborted the active
// scope deletion, then we don't display the
// error, and we may have to re-activate
// the scope. Otherwise, it's a genuine
// error, and we put up an error message.
//
if (!fAbortDelete)
{
theApp.MessageBox( err ) ;
return;
}
else
{
if (fDeactivated)
{
//
// We de-activated the scope preperatory to
// to deleting the scope, but later aborted
// this, so undo the de-activation now.
//
pdhcScope->SetEnabled(TRUE) ;
pdhcScope->SetDirty() ;
pdhcScope->Update();
}
}
}
}
} // DeleteCurrentScope
void
CScopesDlg::LeasesReview()
{
ASSERT( QueryCurrentScope() != NULL );
theApp.UpdateStatusBar(IDS_STATUS_GETTING_LEASES);
theApp.BeginWaitCursor() ;
CDhcpScope * pScope = QueryCurrentScope();
ASSERT(m_liVersion.QuadPart >= CHostName::liNT35.QuadPart);
CDhcpLeaseDlg dlgLeases(
pScope,
theApp.QueryHostTypeList( *QueryCurrentScope() )->QueryTypeList(),
//
// Reconciliation option available on 3.51+ only
//
m_liVersion.QuadPart >= CHostName::liNT351.QuadPart,
this
) ;
theApp.EndWaitCursor() ;
theApp.UpdateStatusBar();
dlgLeases.DoModal() ;
}
/////////////////////////////////////////////////////////////////////////////
// CScopesDlg message handlers
void
CScopesDlg::OnDblclkListScopes()
{
LONG err = 0;
int nCurSel = m_list_scopes.GetCurSel();
if (nCurSel == LB_ERR)
{
return;
}
CLBScope * p = (CLBScope *)m_list_scopes.GetItemDataPtr(nCurSel);
ASSERT((int)p != -1);
ASSERT(p != NULL);
//
// If the current selection is a scope, then show the address lease
// information for that scope
//
if (p->IsScope())
{
LeasesReview(); // Show the current address lease information
return;
}
// Otherwise, attempt to connect
ChangeSelectedScope(nCurSel);
//
// Else change the open/close state of the host we're pointing
// at, expand the scopes, or collapse them.
//
if (p->GetScopePtr() == NULL)
{
//
// This is an unitialised host -- attempt to initialise
// the scope.
//
OnSelchangeListScopes();
//::MessageBeep(MB_ICONEXCLAMATION);
return;
}
if (p->IsOpen())
{
//
// Notice that a double click on a closed entry
// would open and then close the entry. To prevent
// this, check to see if the opening was just executed
// and if so, ignore this closure.
//
LONG lTime;
::time (&lTime);
if (lTime == m_lastSelTime)
{
return;
}
m_list_scopes.SetRedraw(FALSE);
err = CloseHost(nCurSel, TRUE);
m_list_scopes.SetRedraw(TRUE);
m_list_scopes.Invalidate() ;
if (err != ERROR_SUCCESS)
{
theApp.MessageBox(err);
}
}
else
{
m_list_scopes.SetRedraw(FALSE);
err = OpenHost(nCurSel);
m_list_scopes.SetRedraw(TRUE);
m_list_scopes.Invalidate() ;
}
//
// Repaint the host currently selected
//
if (err == ERROR_SUCCESS)
{
RECT rc;
m_list_scopes.GetItemRect(nCurSel, &rc);
m_list_scopes.InvalidateRect(&rc, FALSE);
}
}
void
CScopesDlg::OnErrspaceListScopes()
{
// REVIEW: should add code here
}
//
// The current selection in the scopes listbox has changed.
// If the current selection is a scope, then display the
// list of options in the options dialog. Otherwise, if it's
// a host, display the scopes defined on that host.
//
void CScopesDlg::ChangeSelectedScope(int nCurSel)
{
if (nCurSel==LB_ERR)
{
// Nothing selected -- clear indicator
TRACEEOLID("CScopesDlg::ChangeSelectedScope(-1) - Nothing to do");
m_pHostName = NULL;
m_p_scope = NULL;
theApp.UpdateStatusBarScope(FALSE);
theApp.UpdateStatusBarHost();
if (GetParentFrame())
((CMainFrame *)GetParentFrame())->FillOptionsListBox(NULL);
return;
}
theApp.BeginWaitCursor();
APIERR err = ERROR_SUCCESS;
CLBScope * p = (CLBScope *)m_list_scopes.GetItemDataPtr(nCurSel);
// BUG: GetItemDataPtr() returns -1 (LB_ERR) if an error occurs
ASSERT((long)p != LB_ERR);
ASSERT(p != NULL);
if ((long)p == LB_ERR || p == NULL)
return;
if (p->IsScope())
{
// Current selection is a scope.
theApp.UpdateStatusBarScope(!p->IsEnabled());
// Set current scope
m_p_scope = p->QueryDhcpScope();
CDhcpScopeId id(m_p_scope->QueryScopeId());
((CMainFrame *)GetParentFrame())->FillOptionsListBox(m_p_scope);
// Current host is the owner of the current scope.
m_pHostName = &id;
if (p->QueryVersionNumber().QuadPart == CHostName::liBadVersion.QuadPart)
{
TRACEEOLID("Setting version number for scope");
if (!m_pHostName->SetVersionNumber())
{
err = ::GetLastError();
p->SetVersionNumber(&CHostName::liBadVersion);
}
else
{
p->SetVersionNumber(&(m_pHostName->QueryVersionNumber()));
}
}
m_liVersion = p->QueryVersionNumber();
}
else
{
// Clear the paused indicator -- current selection is
// not a scope.
theApp.UpdateStatusBarScope(FALSE);
theApp.UpdateStatusBar(IDS_STATUS_CONNECTING_TO_SERVER);
// Clear the options listbox, this is a host after all
((CMainFrame *)GetParentFrame())->FillOptionsListBox();
// Set current scope and host
m_pHostName = p->QueryHostName() ;
m_p_scope = NULL;
// Now check that this host is accessible...
CObOwnedList * p_obl_scopes = p->GetScopePtr();
BOOL fUninitialisedHost = p_obl_scopes == NULL;
if (p->QueryVersionNumber().QuadPart == CHostName::liBadVersion.QuadPart)
{
TRACEEOLID("Setting version number for host");
if (!p->QueryHostName()->SetVersionNumber()) // INFO: This instruction is very very slowwwww
{
//err = ::GetLastError();
err = ERROR_NOT_CONNECTED;
p->SetVersionNumber(&CHostName::liBadVersion);
}
else
{
p->SetVersionNumber(&(p->QueryHostName()->QueryVersionNumber()));
}
}
m_liVersion = p->QueryVersionNumber();
if (err == ERROR_SUCCESS)
{
err = InitialiseScopes(p->QueryHostName(), &p_obl_scopes); // Lot of time wasted here too!!!
}
if (err == ERROR_SUCCESS)
{
p->GetScopePtr() = p_obl_scopes;
if (fUninitialisedHost && !p->IsOpen())
{
m_list_scopes.SetRedraw(FALSE);
OpenHost(nCurSel);
m_list_scopes.SetRedraw(TRUE);
m_list_scopes.Invalidate();
}
}
else
{
p->GetScopePtr() = NULL;
// Kill the owned list of scopes (which will free itself)
if (p_obl_scopes != NULL)
{
delete p_obl_scopes;
p_obl_scopes = NULL;
}
CHAR sz[1000];
CString str;
str.LoadString(IDS_CONNECT_ERROR);
//theApp.LoadMessage (err, sz1, sizeof(sz1));
::wsprintf (sz, str, p->QueryString());
if (::AfxMessageBox(sz, MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION) == IDYES)
{
DeleteHost(nCurSel);
}
m_pHostName = NULL;
}
}
// Set the status bar to indicate the current host/server
theApp.UpdateStatusBarHost( m_pHostName ) ;
theApp.UpdateStatusBar();
theApp.EndWaitCursor();
} // ChangeSelectedScope
void
CScopesDlg::OnSelchangeListScopes()
{
int nCurSel = m_list_scopes.GetCurSel();
if (nCurSel == LB_ERR)
{
// This should not happen
TRACE0("CScopesDlg::OnSelchangeListScopes(), nCurSel == LB_ERR\n");
return;
}
CLBScope * p = (CLBScope *)m_list_scopes.GetItemDataPtr(nCurSel);
ASSERT((int)p != -1);
ASSERT(p != NULL);
if (p->IsScope())
{
// If the current selection is a scope, then show extra information
// for that scope
ChangeSelectedScope(nCurSel);
}
else
{
// Otherwise, clear the right-pane list box
((CMainFrame *)GetParentFrame())->FillOptionsListBox(NULL);
m_p_scope = NULL;
}
}
void
CScopesDlg::OnSize(
UINT nType,
int cx,
int cy
)
{
//
// The size message may arrive before the controls
// have been initialized.
//
if (m_mtTitle.m_hWnd != NULL)
{
RECT rTitle, rNew;
CString str;
m_mtTitle.GetClientRect(&rTitle);
rNew = rTitle;
rNew.right = cx;
m_mtTitle.MoveWindow(&rNew);
rNew.top = rTitle.bottom;
rNew.bottom = cy;
m_list_scopes.MoveWindow(&rNew);
}
}
void
CScopesDlg::OnSysColorChange()
{
m_ListBoxResScopes.SysColorChanged();
CFormView::OnSysColorChange();
}
int
CScopesDlg::OnVKeyToItem(
UINT nKey,
CListBox* pListBox,
UINT nIndex
)
{
CLBScope * p = NULL;
int nCurSel;
switch(nKey)
{
case VK_DELETE:
nCurSel = m_list_scopes.GetCurSel();
if (nCurSel != LB_ERR)
{
p = (CLBScope *)m_list_scopes.GetItemDataPtr(nCurSel);
ASSERT(p != NULL);
}
if (p == NULL)
{
::MessageBeep(MB_ICONEXCLAMATION);
break;
}
if (p->IsScope())
{
DeleteCurrentScope();
}
else
{
DeleteCurrentHost();
}
break;
case VK_INSERT:
nCurSel = m_list_scopes.GetCurSel();
if (nCurSel != LB_ERR)
{
p = (CLBScope *)m_list_scopes.GetItemDataPtr(nCurSel);
ASSERT(p != NULL);
ASSERT((int)p != LB_ERR);
}
if (p == NULL || !p->IsScope())
{
AddHost();
}
else
{
CreateScope();
}
break;
default:
//
// Default actions for arrow keys, etc.
//
return -1;
}
//
// Don't do anything more.
//
return -2;
}