Leaked source code of windows server 2003
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.
 
 
 
 
 
 

939 lines
25 KiB

/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-2000 Microsoft Corporation
//
// Module Name:
// BarfDlg.cpp
//
// Abstract:
// Implementation of the Basic Artifical Resource Failure dialog classes.
//
// Author:
// David Potter (davidp) April 11, 1997
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "resource.h"
#define _RESOURCE_H_
#define _NO_BARF_DEFINITIONS_
#include "Barf.h"
#include "BarfDlg.h"
#include "TraceTag.h"
#include "ExcOper.h"
#ifdef _USING_BARF_
#error BARF failures should be disabled!
#endif
#ifdef _DEBUG // The entire file!
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
/////////////////////////////////////////////////////////////////////////////
// Global Variables
/////////////////////////////////////////////////////////////////////////////
CTraceTag g_tagBarfDialog(_T("Debug"), _T("BARF Dialog"), 0);
//*************************************************************************//
/////////////////////////////////////////////////////////////////////////////
// CBarfDialog
/////////////////////////////////////////////////////////////////////////////
CBarfDialog * CBarfDialog::s_pdlg = NULL;
HICON CBarfDialog::s_hicon = NULL;
/////////////////////////////////////////////////////////////////////////////
// Message Maps
BEGIN_MESSAGE_MAP(CBarfDialog, CDialog)
//{{AFX_MSG_MAP(CBarfDialog)
ON_BN_CLICKED(IDC_BS_RESET_CURRENT_COUNT, OnResetCurrentCount)
ON_BN_CLICKED(IDC_BS_RESET_ALL_COUNTS, OnResetAllCounts)
ON_BN_CLICKED(IDC_BS_GLOBAL_ENABLE, OnGlobalEnable)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_BS_CATEGORIES_LIST, OnItemChanged)
ON_BN_CLICKED(IDC_BS_CONTINUOUS, OnStatusChange)
ON_BN_CLICKED(IDC_BS_DISABLE, OnStatusChange)
ON_EN_CHANGE(IDC_BS_FAIL_AT, OnStatusChange)
ON_WM_CLOSE()
//}}AFX_MSG_MAP
ON_COMMAND(IDCANCEL, OnCancel)
ON_MESSAGE(WM_USER+5, OnBarfUpdate)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::CBarfDialog
//
// Routine Description:
// Constructor.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CBarfDialog::CBarfDialog(void)
{
//{{AFX_DATA_INIT(CBarfDialog)
m_nFailAt = 0;
m_bContinuous = FALSE;
m_bDisable = FALSE;
m_bGlobalEnable = FALSE;
//}}AFX_DATA_INIT
Trace(g_tagBarfDialog, _T("CBarfDialog::CBarfDialog"));
m_pbarfSelected = NULL;
} //*** CBarfDialog::CBarfDialog()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::Create
//
// Routine Description:
// Modeless dialog creation method.
//
// Arguments:
// pParentWnd [IN OUT] Parent window for the dialog.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CBarfDialog::Create(
IN OUT CWnd * pParentWnd //=NULL
)
{
Trace(g_tagBarfDialog, _T("CBarfDialog::Create"));
return CDialog::Create(IDD, pParentWnd);
} //*** CBarfDialog::Create()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::DoDataExchange
//
// Routine Description:
// Do data exchange between the dialog and the class.
//
// Arguments:
// pDX [IN OUT] Data exchange object
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBarfDialog::DoDataExchange(CDataExchange * pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBarfDialog)
DDX_Control(pDX, IDC_BS_GLOBAL_ENABLE, m_ckbGlobalEnable);
DDX_Control(pDX, IDC_BS_DISABLE, m_ckbDisable);
DDX_Control(pDX, IDC_BS_CONTINUOUS, m_ckbContinuous);
DDX_Control(pDX, IDC_BS_CATEGORIES_LIST, m_lcCategories);
DDX_Text(pDX, IDC_BS_FAIL_AT, m_nFailAt);
DDX_Check(pDX, IDC_BS_CONTINUOUS, m_bContinuous);
DDX_Check(pDX, IDC_BS_DISABLE, m_bDisable);
DDX_Check(pDX, IDC_BS_GLOBAL_ENABLE, m_bGlobalEnable);
//}}AFX_DATA_MAP
if (pDX->m_bSaveAndValidate)
{
} // if: saving data from the dialog
else
{
int ili;
CBarf * pbarf;
CString str;
ili = m_lcCategories.GetNextItem(-1, LVNI_SELECTED);
if (ili == -1)
ili = m_lcCategories.GetNextItem(-1, LVNI_FOCUSED);
if (ili != -1)
{
pbarf = (CBarf *) m_lcCategories.GetItemData(ili);
// Set the current count.
str.Format(_T("%d"), pbarf->NCurrent());
VERIFY(m_lcCategories.SetItemText(ili, 1, str));
// Set the failure point.
str.Format(_T("%d"), pbarf->NFail());
VERIFY(m_lcCategories.SetItemText(ili, 2, str));
} // if: there is an item with focus
} // else: setting data to the dialog
} //*** CBarfDialog::DoDataExchange()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::OnInitDialog
//
// Routine Description:
// Handler for the WM_INITDIALOG message.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Focus needs to be set.
// FALSE Focus already set.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CBarfDialog::OnInitDialog(void)
{
// Call the base class.
CDialog::OnInitDialog();
ASSERT(Pdlg() == NULL);
s_pdlg = this;
// Set the post update function to point to our static function.
CBarf::SetPostUpdateFn(&PostUpdate);
CBarf::SetSpecialMem(Pdlg());
// Add the columns to the list control.
{
m_lcCategories.InsertColumn(0, _T("Category"), LVCFMT_LEFT, 100);
m_lcCategories.InsertColumn(1, _T("Count"), LVCFMT_LEFT, 50);
m_lcCategories.InsertColumn(2, _T("Fail At"), LVCFMT_LEFT, 50);
} // Add the columns to the list control
// Set-up the dialog based on the real values...
FillList();
OnUpdate();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
} //*** CBarfDialog::OnInitDialog()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::OnClose
//
// Routine Description:
// Handler method for the WM_CLOSE message.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBarfDialog::OnClose(void)
{
CDialog::OnClose();
DestroyWindow();
} //*** CBarfDialog::OnClose()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::OnCancel
//
// Routine Description:
// Handler method for the WM_COMMAND message when IDCANCEL is sent.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBarfDialog::OnCancel(void)
{
CDialog::OnCancel();
DestroyWindow();
} //*** CBarfDialog::OnCancel()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::PostNcDestroy
//
// Routine Description:
// Processing after non-client has been destroyed.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBarfDialog::PostNcDestroy(void)
{
CDialog::PostNcDestroy();
delete this;
CBarf::ClearPostUpdateFn();
s_pdlg = NULL;
} //*** CBarfDialog::PostNcDestroy()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::FillList
//
// Routine Description:
// Loads the list of failure categories.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBarfDialog::FillList(void)
{
int ili;
int iliReturn;
CString str;
CBarf * pbarf = CBarf::s_pbarfFirst;
CBarfSuspend bs;
m_lcCategories.DeleteAllItems();
for (ili = 0 ; pbarf != NULL ; ili++)
{
// Insert the item.
iliReturn = m_lcCategories.InsertItem(ili, pbarf->PszName());
ASSERT(iliReturn != -1);
// Set the current count.
str.Format(_T("%d"), pbarf->NCurrent());
VERIFY(m_lcCategories.SetItemText(iliReturn, 1, str));
// Set the failure point.
str.Format(_T("%d"), pbarf->NFail());
VERIFY(m_lcCategories.SetItemText(iliReturn, 2, str));
// Set the pointer in the entry so we can retrieve it later.
VERIFY(m_lcCategories.SetItemData(iliReturn, (DWORD) pbarf));
// Advance to the next entry
pbarf = pbarf->m_pbarfNext;
} // while: more BARF entries
// If no known selection yet, get the current selection.
if (m_pbarfSelected == NULL)
{
ili = m_lcCategories.GetNextItem(-1, LVNI_SELECTED);
if (ili == -1)
ili = 0;
m_pbarfSelected = (CBarf *) m_lcCategories.GetItemData(ili);
if (m_pbarfSelected != NULL)
OnUpdate();
} // if: no know selection
// Select the proper item.
{
LV_FINDINFO lvfi = { LVFI_PARAM, NULL, (DWORD) m_pbarfSelected };
ili = m_lcCategories.FindItem(&lvfi);
if (ili != -1)
m_lcCategories.SetItemState(ili, LVIS_SELECTED, LVIS_SELECTED);
} // Select the proper item
} //*** CBarfDialog::FillList()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::OnUpdate
//
// Routine Description:
// Updates the displayed counts to their TRUE values.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBarfDialog::OnUpdate(void)
{
Trace(g_tagBarfDialog, _T("Updating the counts."));
ASSERT(m_pbarfSelected != NULL);
m_bContinuous = m_pbarfSelected->BContinuous();
m_bDisable = m_pbarfSelected->BDisabled();
m_nFailAt = m_pbarfSelected->NFail();
m_bGlobalEnable = CBarf::s_bGlobalEnable;
UpdateData(FALSE /*bSaveAndValidate*/);
} //*** CBarfDialog::OnUpdate()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::OnGlobalEnable
//
// Routine Description:
// Handler function for the BN_CLICKED message on the Global Enable
// checkbox.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBarfDialog::OnGlobalEnable(void)
{
ASSERT(m_ckbGlobalEnable.m_hWnd != NULL);
CBarf::s_bGlobalEnable = m_ckbGlobalEnable.GetCheck() == BST_CHECKED;
} //*** CBarfDialog::OnGlobalEnable()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::OnResetCurrentCount
//
// Routine Description:
// Handler function for the BN_CLICKED message on the Reset Current
// Count button.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBarfDialog::OnResetCurrentCount(void)
{
int ili;
CBarf * pbarf;
ASSERT(m_lcCategories.m_hWnd != NULL);
// Get the selected item.
ili = m_lcCategories.GetNextItem(-1, LVIS_SELECTED);
ASSERT(ili != -1);
pbarf = (CBarf *) m_lcCategories.GetItemData(ili);
ASSERT(pbarf != NULL);
ASSERT(pbarf == m_pbarfSelected);
// Reset the count.
pbarf->m_nCurrent = 0;
OnStatusChange();
} //*** CBarfDialog::OnResetCurrentCount()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::OnResetAllCounts
//
// Routine Description:
// Handler function for the BN_CLICKED message on the Reset All
// Counts button.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBarfDialog::OnResetAllCounts(void)
{
CBarf * pbarf = CBarf::s_pbarfFirst;
Trace(g_tagBarfDialog, _T("Resetting ALL current counts."));
while (pbarf != NULL)
{
pbarf->m_nCurrent = 0;
pbarf = pbarf->m_pbarfNext;
} // while: more BARF entries
FillList();
} //*** CBarfDialog::OnResetAllCounts()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::OnResetAllCounts
//
// Routine Description:
// Handler function for the LVN_ITEMCHANGED message from the list control.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBarfDialog::OnItemChanged(NMHDR * pNMHDR, LRESULT * pResult)
{
NM_LISTVIEW * pNMListView = (NM_LISTVIEW *) pNMHDR;
// If the item just became unselected or selected, change the checkboxes to match.
if ((pNMListView->uChanged & LVIF_STATE)
&& ((pNMListView->uOldState & LVIS_SELECTED)
|| (pNMListView->uNewState & LVIS_SELECTED)))
{
// Handle a selection change.
m_pbarfSelected = (CBarf *) pNMListView->lParam;
OnStatusChange();
} // if: item received the focus
*pResult = 0;
} //*** CBarfDialog::OnItemChanged()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::OnStatusChange
//
// Routine Description:
// Adjusts the C== object when the status of the currently selected
// item changes.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBarfDialog::OnStatusChange(void)
{
ASSERT(m_pbarfSelected != NULL);
UpdateData(TRUE /*bSaveAndValidate*/);
m_pbarfSelected->m_bContinuous = m_bContinuous;
m_pbarfSelected->m_bDisabled = m_bDisable;
m_pbarfSelected->m_nFail = m_nFailAt;
UpdateData(FALSE /*bSaveAndValidate*/);
} //*** CBarfDialog::OnStatusChange()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::OnBarfUpdate
//
// Routine Description:
// Handler for the WM_USER message.
// Processes barf notifications.
//
// Arguments:
// wparam 1st parameter.
// lparam 2nd parameter.
//
// Return Value:
// Value returned from the application method.
//
//--
/////////////////////////////////////////////////////////////////////////////
LRESULT CBarfDialog::OnBarfUpdate(WPARAM wparam, LPARAM lparam)
{
OnUpdate();
return 0;
} //*** CBarfDialog::OnBarfUpdate()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfDialog::PostUpdate
//
// Routine Description:
// Static function so that CBarf::BFail can post updates to us.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBarfDialog::PostUpdate(void)
{
// If this function gets called, there should be BARF dialog.
ASSERT(Pdlg() != NULL);
if (Pdlg() != NULL)
::PostMessage(Pdlg()->m_hWnd, WM_USER+5, NULL, NULL);
} //*** CBarfDialog::PostUpdate()
//*************************************************************************//
/////////////////////////////////////////////////////////////////////////////
// CBarfAllDialog
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// Message Maps
BEGIN_MESSAGE_MAP(CBarfAllDialog, CDialog)
//{{AFX_MSG_MAP(CBarfAllDialog)
ON_BN_CLICKED(IDC_BAS_MENU_ITEM, OnMenuItem)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfAllDialog::CBarfAllDialog
//
// Routine Description:
// Constructor.
//
// Arguments:
// pParentWnd [IN OUT] Parent window for the dialog.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CBarfAllDialog::CBarfAllDialog(
IN OUT CWnd * pParentWnd //=NULL
)
: CDialog(IDD, pParentWnd)
{
//{{AFX_DATA_INIT(CBarfAllDialog)
//}}AFX_DATA_INIT
m_hwndBarf = NULL;
m_wmBarf = 0;
m_wparamBarf = 0;
m_lparamBarf = 0;
} //*** CBarfAllDialog::CBarfAllDialog()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfAllDialog::DoDataExchange
//
// Routine Description:
// Do data exchange between the dialog and the class.
//
// Arguments:
// pDX [IN OUT] Data exchange object
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBarfAllDialog::DoDataExchange(CDataExchange * pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBarfAllDialog)
DDX_Control(pDX, IDC_BAS_LPARAM, m_editLparam);
DDX_Control(pDX, IDC_BAS_WPARAM, m_editWparam);
DDX_Control(pDX, IDC_BAS_WM, m_editWm);
DDX_Control(pDX, IDC_BAS_HWND, m_editHwnd);
//}}AFX_DATA_MAP
DDX_Text(pDX, IDC_BAS_HWND, (DWORD &) m_hwndBarf);
DDX_Text(pDX, IDC_BAS_WM, m_wmBarf);
DDX_Text(pDX, IDC_BAS_WPARAM, m_wparamBarf);
DDX_Text(pDX, IDC_BAS_LPARAM, m_lparamBarf);
} //*** CBarfAllDialog::DoDataExchange()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfAllDialog::OnInitDialog
//
// Routine Description:
// Handler for the WM_INITDIALOG message.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Focus needs to be set.
// FALSE Focus already set.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CBarfAllDialog::OnInitDialog(void)
{
// Call the base class.
CDialog::OnInitDialog();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
} //*** CBarfAllDialog::OnInitDialog()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfAllDialog::OnOK
//
// Routine Description:
// Handler for the BN_CLICKED message on the OK button.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBarfAllDialog::OnOK(void)
{
if (m_hwndBarf == NULL)
m_hwndBarf = AfxGetMainWnd()->m_hWnd;
CDialog::OnOK();
} //*** CBarfAllDialog::OnDialog()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CBarfAllDialog::OnMenuItem
//
// Routine Description:
// Handler for the BN_CLICKED message on the Menu Item button.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CBarfAllDialog::OnMenuItem(void)
{
m_editHwnd.SetWindowText(_T("0"));
m_editWm.SetWindowText(_T("273")); // WM_COMMAND
m_editLparam.SetWindowText(_T("0"));
m_editWparam.SetWindowText(_T("0"));
} //*** CBarfAllDialog::OnMenuItem()
//*************************************************************************//
/////////////////////////////////////////////////////////////////////////////
// Global Functions
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//++
//
// BarfAll
//
// Routine Description:
// Exercises all possible single failures.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void BarfAll(void)
{
CBarf * pbarf;
CBarfAllDialog dlg(AfxGetMainWnd());
ID id;
CString str;
// First, pick-up the message to test.
id = dlg.DoModal();
if (id != IDOK)
{
Trace(g_tagAlways, _T("BarfAll() - operation cancelled."));
return;
} // if: BarfAll cancelled
Trace(g_tagAlways,
_T("BarfAll with hwnd = %#08lX, wm = 0x%4x, wparam = %d, lparam = %d"),
dlg.HwndBarf(), dlg.WmBarf(), dlg.WparamBarf(), dlg.LparamBarf());
// Now, find out how many counts of each resource...
pbarf = CBarf::s_pbarfFirst;
while (pbarf != NULL)
{
pbarf->m_nCurrentSave = pbarf->m_nCurrent;
pbarf->m_nCurrent = 0;
pbarf->m_nFail = 0;
pbarf->m_bContinuous = FALSE;
pbarf->m_bDisabled = FALSE;
pbarf = pbarf->m_pbarfNext;
} // while: more BARF entries
if (CBarfDialog::Pdlg())
CBarfDialog::Pdlg()->OnUpdate();
str = _T("BarfAll Test pass.");
Trace(g_tagAlways, str);
SendMessage(dlg.HwndBarf(), dlg.WmBarf(),
dlg.WparamBarf(), dlg.LparamBarf());
pbarf = CBarf::s_pbarfFirst;
while (pbarf != NULL)
{
pbarf->m_nBarfAll = pbarf->m_nCurrentSave;
pbarf = pbarf->m_pbarfNext;
} // while: more entries in the list
MessageBox(dlg.HwndBarf(), str, _T("BARF Status"), MB_OK | MB_ICONEXCLAMATION);
// Finally, THE big loop...
pbarf = CBarf::s_pbarfFirst;
while (pbarf != NULL)
{
for (pbarf->m_nFail = 1
; pbarf->m_nFail <= pbarf->m_nBarfAll
; pbarf->m_nFail++)
{
// CBarfMemory::Mark();
pbarf->m_nCurrent = 0;
if (CBarfDialog::Pdlg())
CBarfDialog::Pdlg()->OnUpdate();
str.Format(_T("BarfAll on resource %s, call # %d of %d"),
pbarf->m_pszName, pbarf->m_nFail, pbarf->m_nBarfAll);
Trace(g_tagAlways, str);
SendMessage(dlg.HwndBarf(), dlg.WmBarf(),
dlg.WparamBarf(), dlg.LparamBarf());
// CBarfMemory::DumpMarked();
// ValidateMemory();
str += _T("\nContinue?");
if (MessageBox(dlg.HwndBarf(), str, _T("BARF: Pass Complete."), MB_YESNO | MB_ICONEXCLAMATION) != IDYES)
break;
} // for: while the failure count is less than the BARF All count
pbarf->m_nFail = 0;
pbarf->m_nCurrent = pbarf->m_nCurrentSave;
pbarf = pbarf->m_pbarfNext;
} // while: more BARF entries
if (CBarfDialog::Pdlg())
CBarfDialog::Pdlg()->OnUpdate();
} //*** BarfAll()
/////////////////////////////////////////////////////////////////////////////
//++
//
// DoBarfDialog
//
// Routine Description:
// Launches the Barf Settings dialog.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void DoBarfDialog( void )
{
if ( CBarf::s_pbarfFirst == NULL )
{
AfxMessageBox( _T("No BARF counters defined yet."), MB_OK );
} // if: no counters defined yet
else if ( CBarfDialog::Pdlg() )
{
BringWindowToTop( CBarfDialog::Pdlg()->m_hWnd );
if ( IsIconic( CBarfDialog::Pdlg()->m_hWnd ) )
{
SendMessage( CBarfDialog::Pdlg()->m_hWnd, WM_SYSCOMMAND, SC_RESTORE, NULL );
} // if: window is currently minimized
} // if: there is already a dialog up
else
{
CBarfDialog * pdlg = NULL;
try
{
pdlg = new CBarfDialog;
if ( pdlg == NULL )
{
AfxThrowMemoryException();
} // if: error allocating the dialog
pdlg->Create( AfxGetMainWnd() );
} // try
catch ( CException * pe )
{
pe->ReportError();
pe->Delete();
} // catch: CException
} // else: no dialog up yet
} //*** DoBarfDialog()
#endif // _DEBUG