windows-nt/Source/XPSP1/NT/enduser/netmeeting/ui/conf/dbgmenu.cpp
2020-09-26 16:20:57 +08:00

2034 lines
52 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/****************************************************************************
*
* FILE: DbgMenu.cpp
*
* CREATED: Robert Donner (RobD) 2-04-96
*
* CONTENTS: CDebugMenu object
*
****************************************************************************/
/*
To add a debug menu option:
1) Add the text to _rgDbgSz
2) Add a function call to OnDebugCommand
To add a checkbox in the debug options dialog:
2) Use either AddOptionReg or AddOptionPdw with appropriate parameters
To add a file to the version list
1) Edit dbgfiles.txt
*/
#include "precomp.h"
#include "particip.h"
#include "DbgMenu.h"
#include "confroom.h"
#include "conf.h"
#include "version.h"
#include "pfnver.h"
#include "dlgacd.h"
#include <ConfCpl.h>
#ifdef DEBUG /*** THIS WHOLE FILE ***/
#include "DbgFiles.h" // List of files for version info
#include "..\..\core\imember.h" // for CNmMember
#include "..\..\as\h\gdc.h" // for GCT compression stuff
CDebugMenu * g_pDbgMenu = NULL;
HWND ghwndVerList;
////////////////////////////
// Local Function Prototypes
VOID DbgSplash(HWND hwnd);
VOID DbgTest2(void);
VOID DbgTest3(void);
VOID DbgWizard(BOOL fVisible);
VOID DbgBreak(void);
VOID UpdateCrtDbgSettings(void);
VOID InitNmDebugOptions(void);
VOID SaveNmDebugOptions(void);
/*** Globals ***/
extern DWORD g_fDisplayFPS; // vidview.cpp
extern DWORD g_fDisplayViewStatus; // statbar.cpp
extern DWORD g_dwPlaceCall; // controom.cpp
#define iDbgChecked 1
#define iDbgUnchecked 2
DWORD _dwDebugModuleFlags;
/*** Debug Menu Data ***/
enum {
IDM_DBG_OPTIONS = IDM_DEBUG_FIRST,
IDM_DBG_ZONES,
IDM_DBG_POLICY,
IDM_DBG_UI,
IDM_DBG_VERSION,
IDM_DBG_MEMBERS,
IDM_DBG_WIZARD,
IDM_DBG_BREAK,
IDM_DBG_SPLASH,
IDM_DBG_TEST2,
IDM_DBG_TEST3
};
static DWSTR _rgDbgMenu[] = {
IDM_DBG_OPTIONS, TEXT("Debug Options..."),
IDM_DBG_ZONES, TEXT("Zones..."),
IDM_DBG_POLICY, TEXT("System Policies..."),
IDM_DBG_UI, TEXT("User Interface..."),
0, NULL,
IDM_DBG_VERSION, TEXT("Version Info..."),
IDM_DBG_MEMBERS, TEXT("Member Info..."),
0, NULL,
IDM_DBG_WIZARD, TEXT("Run Wizard"),
IDM_DBG_BREAK, TEXT("Break"),
0, NULL,
IDM_DBG_SPLASH, TEXT("Show/Hide Splash Screen"),
IDM_DBG_TEST2, TEXT("Test 2"),
IDM_DBG_TEST3, TEXT("Test 3"),
};
BOOL CDebugMenu::OnDebugCommand(WPARAM wCmd)
{
switch (wCmd)
{
case IDM_DBG_OPTIONS: DbgOptions(); break;
case IDM_DBG_ZONES: DbgChangeZones(); break;
case IDM_DBG_POLICY: DbgSysPolicy(); break;
case IDM_DBG_UI: DbgUI(); break;
case IDM_DBG_VERSION: DbgVersion(); break;
case IDM_DBG_MEMBERS: DbgMemberInfo(); break;
case IDM_DBG_WIZARD: DbgWizard(TRUE); break;
case IDM_DBG_BREAK: DbgBreak(); break;
case IDM_DBG_SPLASH: DbgSplash(m_hwnd);break;
case IDM_DBG_TEST2: DbgTest2(); break;
case IDM_DBG_TEST3: DbgTest3(); break;
default: break;
}
return TRUE;
}
/*** Version Info Data ***/
// FUTURE: Merge these into a single structure
#define cVerInfo 11
#define VERSION_INDEX 3
static PTSTR _rgszVerInfo[cVerInfo] = {
TEXT("InternalName"),
TEXT("Size"),
TEXT("Date"),
TEXT("FileVersion"),
TEXT("FileDescription"),
TEXT("CompanyName"),
TEXT("LegalCopyright"),
TEXT("ProductName"),
TEXT("ProductVersion"),
TEXT("InternalName"),
TEXT("OriginalFilename")
};
static PTSTR _rgVerTitle[cVerInfo] = {
TEXT("Filename"),
TEXT("Size"),
TEXT("Date"),
TEXT("Version"),
TEXT("Description"),
TEXT("Company"),
TEXT("Trademark"),
TEXT("Product"),
TEXT("Version"),
TEXT("Name"),
TEXT("File")
};
static int _rgVerWidth[cVerInfo] = {
70,
70,
70,
70,
200,
70,
70,
70,
70,
70,
70
};
static TCHAR _szStringFileInfo[] = TEXT("StringFileInfo");
static TCHAR _szVerIntlUSA[] = TEXT("040904E4");
static TCHAR _szVerIntlAlt[] = TEXT("040904B0");
static TCHAR _szVerFormat[] = TEXT("\\%s\\%s\\%s");
/*** Debug Option Checkboxes ***/
#define DEBUG_DFL_ENABLE_TRACE_MESSAGES 0x0001
#define DEBUG_DFL_LOG_TRACE_MESSAGES 0x0002
#define DEBUG_DFL_DUMP_THREAD_ID 0x0004
#define DEBUG_DFL_ENABLE_CALL_TRACING 0x0008
#define DEBUG_DFL_DUMP_TIME 0x0010
#define DEBUG_DFL_INDENT 0x2000
/* Static members of DBGOPTCOMPRESS class */
int DBGOPTCOMPRESS::m_total = 0; // total number of instances of this subclass
int DBGOPTCOMPRESS::m_count = 0; // internally used counter
DWORD DBGOPTCOMPRESS::m_dwCompression; // actual compression value
DWORD DBGOPTCOMPRESS::m_dwDefault = GCT_DEFAULT; // default value
HKEY DBGOPTCOMPRESS::m_hkey = HKEY_LOCAL_MACHINE; // key
PTSTR DBGOPTCOMPRESS::m_pszSubKey = AS_DEBUG_KEY; // subkey
PTSTR DBGOPTCOMPRESS::m_pszEntry = REGVAL_AS_COMPRESSION; // entry
VOID ShowDbgView(void)
{
if (ShellExecute(NULL, NULL, "dbgview.exe", NULL, NULL, SW_SHOW) <= (HINSTANCE) 32)
{
ConfMsgBox(NULL, TEXT("Unable to start 'DbgView.exe'"));
}
}
/****************************************************************************
*
* CLASS: CDebugMenu
*
* MEMBER: CDebugMenu()
*
* PURPOSE: Constructor - initializes variables
*
****************************************************************************/
CDebugMenu::CDebugMenu(VOID):
m_hwnd(NULL),
m_hMenu(NULL),
m_hMenuDebug(NULL)
{
DebugEntry(CDebugMenu::CDebugMenu);
DebugExitVOID(CDebugMenu::CDebugMenu);
}
/****************************************************************************
*
* CLASS: CDebugMenu
*
* MEMBER: InitDebugMenu()
*
* PURPOSE: Puts debug menu options on the menu bar
*
****************************************************************************/
VOID CDebugMenu::InitDebugMenu(HWND hwnd)
{
m_hwnd = hwnd;
if (NULL == hwnd)
return;
m_hMenu = GetMenu(hwnd);
if (NULL == m_hMenu)
return;
m_hMenuDebug = CreateMenu();
if (NULL == m_hMenuDebug)
return;
for (int i = 0; i < ARRAY_ELEMENTS(_rgDbgMenu); i++)
{
if (0 == _rgDbgMenu[i].dw)
{
AppendMenu(m_hMenuDebug, MF_SEPARATOR, 0, 0);
}
else if (!AppendMenu(m_hMenuDebug, MF_STRING | MF_ENABLED,
_rgDbgMenu[i].dw, _rgDbgMenu[i].psz))
{
return;
}
}
AppendMenu(m_hMenu, MF_POPUP, (UINT_PTR) m_hMenuDebug, TEXT(" "));
}
/////////////////////////////////////////////////////////////////////////////
// D I A L O G: O P T I O N S
/////////////////////////////////////////////////////////////////////////////
/****************************************************************************
*
* CLASS: CDebugMenu
*
* MEMBER: DbgOptions()
*
* PURPOSE: Brings up the debug options dialog box
*
****************************************************************************/
VOID CDebugMenu::DbgOptions(VOID)
{
DebugEntry(CDebugMenu::DbgOptions);
DialogBoxParam(GetInstanceHandle(), MAKEINTRESOURCE(IDD_DBG_OPTIONS),
m_hwnd, CDebugMenu::DbgOptionsDlgProc, (LPARAM) this);
DebugExitVOID(CDebugMenu::DbgOptions);
}
/****************************************************************************
*
* CLASS: CDebugMenu
*
* MEMBER: DbgOptionsDlgProc()
*
* PURPOSE: Dialog Proc for debug options
*
****************************************************************************/
INT_PTR CALLBACK CDebugMenu::DbgOptionsDlgProc(HWND hDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
if (WM_INITDIALOG == uMsg)
{
if (NULL == lParam)
return FALSE;
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
((CDebugMenu *) lParam)->InitOptionsDlg(hDlg);
((CDebugMenu *) lParam)->InitOptionsData(hDlg);
return TRUE;
}
CDebugMenu * ppd = (CDebugMenu*) GetWindowLongPtr(hDlg, DWLP_USER);
if (NULL == ppd)
return FALSE;
return ppd->DlgOptionsMsg(hDlg, uMsg, wParam, lParam);
}
/* I N I T O P T I O N S D L G */
/*----------------------------------------------------------------------------
%%Function: InitOptionsDlg
----------------------------------------------------------------------------*/
BOOL CDebugMenu::InitOptionsDlg(HWND hDlg)
{
m_hwndDbgopt = GetDlgItem(hDlg, IDL_DEBUG);
if (NULL == m_hwndDbgopt)
return FALSE;
/* Initialize the list view images */
{
HICON hCheckedIcon = LoadIcon(GetInstanceHandle(), MAKEINTRESOURCE(IDI_CHECKON));
HICON hUncheckedIcon = LoadIcon(GetInstanceHandle(), MAKEINTRESOURCE(IDI_CHECKOFF));
HIMAGELIST hStates = ImageList_Create(16, 16, ILC_MASK, 2, 2);
if ((NULL == hStates) || (NULL == hCheckedIcon) || (NULL == hUncheckedIcon))
{
return FALSE;
}
ImageList_AddIcon(hStates, hCheckedIcon);
ImageList_AddIcon(hStates, hUncheckedIcon);
// Associate the image list with the list view
ListView_SetImageList(m_hwndDbgopt, hStates, LVSIL_STATE);
}
/* Initialize the column structure */
{
LV_COLUMN lvC;
RECT rc;
GetClientRect(m_hwndDbgopt, &rc);
ZeroMemory(&lvC, sizeof(lvC));
lvC.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_TEXT;
lvC.fmt = LVCFMT_LEFT;
lvC.cx = rc.right - GetSystemMetrics(SM_CXVSCROLL)
- GetSystemMetrics(SM_CXSMICON)
- 2 * GetSystemMetrics(SM_CXEDGE);
// Add the column.
if (-1 == ListView_InsertColumn(m_hwndDbgopt, 0, &lvC))
{
ERROR_OUT(("Could not insert column in list view"));
return FALSE;
}
}
return TRUE;
}
VOID CDebugMenu::InitOptionsData(HWND hDlg)
{
LV_ITEM lvI;
// Fill in the LV_ITEM structure
// The mask specifies the the .pszText, .iImage, .lParam and .state
// members of the LV_ITEM structure are valid.
ZeroMemory(&lvI, sizeof(lvI));
lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
lvI.stateMask = LVIS_STATEIMAGEMASK;
lvI.cchTextMax = 256;
AddDbgOptions(&lvI);
AddASOptions(&lvI);
}
/* A D D O P T I O N */
/*----------------------------------------------------------------------------
%%Function: AddOption
Add an option line to the listbox
----------------------------------------------------------------------------*/
VOID CDebugMenu::AddOption(LV_ITEM * plvItem, CDebugOption * pDbgOpt)
{
plvItem->pszText = pDbgOpt->m_psz;
plvItem->lParam = (LPARAM) pDbgOpt;
plvItem->state &= ~LVIS_STATEIMAGEMASK;
if (BST_CHECKED == pDbgOpt->m_bst)
plvItem->state |= INDEXTOSTATEIMAGEMASK(iDbgChecked);
else if (BST_UNCHECKED == pDbgOpt->m_bst)
plvItem->state |= INDEXTOSTATEIMAGEMASK(iDbgUnchecked);
if (-1 == ListView_InsertItem(m_hwndDbgopt, plvItem))
{
ERROR_OUT(("problem adding item entry to list view"));
}
else
{
plvItem->iItem++;
}
}
/* A D D O P T I O N S E C T I O N */
/*----------------------------------------------------------------------------
%%Function: AddOptionSection
Add a simple section title
----------------------------------------------------------------------------*/
VOID CDebugMenu::AddOptionSection(LV_ITEM* plvItem, PTSTR psz)
{
CDebugOption * pDbgOpt = new CDebugOption(psz);
if (NULL != pDbgOpt)
AddOption(plvItem, pDbgOpt);
}
/* A D D O P T I O N P D W */
/*----------------------------------------------------------------------------
%%Function: AddOptionPdw
Add an option (global memory flag)
----------------------------------------------------------------------------*/
VOID CDebugMenu::AddOptionPdw(LV_ITEM * plvItem, PTSTR psz, DWORD dwMask, DWORD * pdw = &_dwDebugModuleFlags)
{
DBGOPTPDW * pDbgOpt = new DBGOPTPDW(psz, dwMask, pdw);
if (NULL != pDbgOpt)
AddOption(plvItem, (CDebugOption * ) pDbgOpt);
}
/* A D D O P T I O N R E G */
/*----------------------------------------------------------------------------
%%Function: AddOptionReg
Add a registry option
----------------------------------------------------------------------------*/
VOID CDebugMenu::AddOptionReg(LV_ITEM* plvItem, PTSTR psz, DWORD dwMask, DWORD dwDefault,
PTSTR pszEntry, PTSTR pszSubKey = CONFERENCING_KEY, HKEY hkey = HKEY_CURRENT_USER)
{
DBGOPTREG * pDbgOpt = new DBGOPTREG(psz, dwMask, dwDefault, pszEntry, pszSubKey, hkey);
if (NULL != pDbgOpt)
AddOption(plvItem, (CDebugOption * ) pDbgOpt);
}
/* A D D O P T I O N C O M P R E S S */
/*----------------------------------------------------------------------------
%%Function: AddOptionCompress
Add an option (compression data)
----------------------------------------------------------------------------*/
VOID CDebugMenu::AddOptionCompress(LV_ITEM * plvItem, PTSTR psz, DWORD dwMask, BOOL bCheckedOn)
{
DBGOPTCOMPRESS * pDbgOpt = new DBGOPTCOMPRESS(psz, dwMask, bCheckedOn);
if (NULL != pDbgOpt)
AddOption(plvItem, (CDebugOption * ) pDbgOpt);
}
VOID CDebugMenu::AddDbgOptions(LV_ITEM * plvItem)
{
AddOptionSection(plvItem, TEXT("____Debug Output____"));
AddOptionReg(plvItem, TEXT("Use OutputDebugString"), 1,DEFAULT_DBG_OUTPUT,
REGVAL_DBG_OUTPUT, DEBUG_KEY, HKEY_LOCAL_MACHINE);
AddOptionReg(plvItem, TEXT("Output to Window"), 1, DEFAULT_DBG_NO_WIN,
REGVAL_DBG_WIN_OUTPUT, DEBUG_KEY, HKEY_LOCAL_MACHINE);
AddOptionReg(plvItem, TEXT("Ouput to File"), 1, DEFAULT_DBG_NO_FILE,
REGVAL_DBG_FILE_OUTPUT, DEBUG_KEY, HKEY_LOCAL_MACHINE);
AddOptionReg(plvItem, TEXT("Show ThreadId"), 1, 0,
REGVAL_DBG_SHOW_THREADID, DEBUG_KEY, HKEY_LOCAL_MACHINE);
AddOptionReg(plvItem, TEXT("Show Module Name"), 1, 0,
REGVAL_DBG_SHOW_MODULE, DEBUG_KEY, HKEY_LOCAL_MACHINE);
AddOptionReg(plvItem, TEXT("Enable Retail Log Output"), 1, 0,
REGVAL_RETAIL_LOG, DEBUG_KEY, HKEY_LOCAL_MACHINE);
AddOptionReg(plvItem, TEXT("Show Time"), 1, 0,
REGVAL_DBG_SHOW_TIME, DEBUG_KEY, HKEY_LOCAL_MACHINE);
AddOptionReg(plvItem, TEXT("Format Time"), 2, 0,
REGVAL_DBG_SHOW_TIME, DEBUG_KEY, HKEY_LOCAL_MACHINE);
_dwDebugModuleFlags = GetDebugOutputFlags();
AddOptionPdw(plvItem, TEXT("Function Level Indenting (conf)"),DEBUG_DFL_INDENT);
}
VOID CDebugMenu::AddPolicyOptions(LV_ITEM * plvItem)
{
AddOptionSection(plvItem, TEXT("____Calling____"));
AddOptionReg(plvItem, TEXT("No Auto-Accept"), 1, DEFAULT_POL_NO_AUTOACCEPTCALLS, REGVAL_POL_NO_AUTOACCEPTCALLS, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("Do not allow directory services"), 1, DEFAULT_POL_NO_DIRECTORY_SERVICES, REGVAL_POL_NO_DIRECTORY_SERVICES, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("No Adding Directory Servers"), 1, 0, REGVAL_POL_NO_ADDING_NEW_ULS, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("No changing Call mode"), 1, 0, REGVAL_POL_NOCHANGECALLMODE, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("No web directory"), 1, 0, REGVAL_POL_NO_WEBDIR, POLICIES_KEY);
AddOptionSection(plvItem, TEXT("____Applets____"));
AddOptionReg(plvItem, TEXT("No Chat"), 1, DEFAULT_POL_NO_CHAT, REGVAL_POL_NO_CHAT, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("No Old Whiteboard"), 1, DEFAULT_POL_NO_OLDWHITEBOARD, REGVAL_POL_NO_OLDWHITEBOARD, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("No New Whiteboard"), 1, DEFAULT_POL_NO_NEWWHITEBOARD, REGVAL_POL_NO_NEWWHITEBOARD, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("No File Transfer Send"), 1, DEFAULT_POL_NO_FILETRANSFER_SEND, REGVAL_POL_NO_FILETRANSFER_SEND, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("No File Transfer Receive"), 1, DEFAULT_POL_NO_FILETRANSFER_RECEIVE, REGVAL_POL_NO_FILETRANSFER_RECEIVE, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("No Audio"), 1, DEFAULT_POL_NO_AUDIO, REGVAL_POL_NO_AUDIO, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("No Video Send"), 1, DEFAULT_POL_NO_VIDEO_SEND, REGVAL_POL_NO_VIDEO_SEND, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("No Video Receive"), 1, DEFAULT_POL_NO_VIDEO_RECEIVE, REGVAL_POL_NO_VIDEO_RECEIVE, POLICIES_KEY);
AddOptionSection(plvItem, TEXT("____Sharing____"));
AddOptionReg(plvItem, TEXT("Disable all Sharing features"), 1, DEFAULT_POL_NO_APP_SHARING, REGVAL_POL_NO_APP_SHARING, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("Prevent the user from sharing"), 1, DEFAULT_POL_NO_SHARING, REGVAL_POL_NO_SHARING, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("Disable sharing MS-DOS windows"), 1, DEFAULT_POL_NO_MSDOS_SHARING, REGVAL_POL_NO_MSDOS_SHARING, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("Disable sharing explorer windows"), 1, DEFAULT_POL_NO_EXPLORER_SHARING, REGVAL_POL_NO_EXPLORER_SHARING, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("Disable sharing the desktop"), 1, DEFAULT_POL_NO_DESKTOP_SHARING, REGVAL_POL_NO_DESKTOP_SHARING, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("Disable sharing in true color"), 1, DEFAULT_POL_NO_TRUECOLOR_SHARING, REGVAL_POL_NO_TRUECOLOR_SHARING, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("Prevent the user from allowing control"), 1, DEFAULT_POL_NO_ALLOW_CONTROL, REGVAL_POL_NO_ALLOW_CONTROL, POLICIES_KEY);
AddOptionSection(plvItem, TEXT("____Options Dialog____"));
AddOptionReg(plvItem, TEXT("Disable the 'General' page"), 1, DEFAULT_POL_NO_GENERALPAGE, REGVAL_POL_NO_GENERALPAGE, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("Disable the 'Advanced Calling' button"), 1, DEFAULT_POL_NO_ADVANCEDCALLING, REGVAL_POL_NO_ADVANCEDCALLING, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("Disable the 'Security' page"), 1, DEFAULT_POL_NO_SECURITYPAGE, REGVAL_POL_NO_SECURITYPAGE, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("Disable the 'Audio' page"), 1, DEFAULT_POL_NO_AUDIOPAGE, REGVAL_POL_NO_AUDIOPAGE, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("Disable the 'Video' page"), 1, DEFAULT_POL_NO_VIDEOPAGE, REGVAL_POL_NO_VIDEOPAGE, POLICIES_KEY);
AddOptionSection(plvItem, TEXT("____Audio / NAC____"));
AddOptionReg(plvItem, TEXT("No changing Direct Sound usage"), 1, 0, REGVAL_POL_NOCHANGE_DIRECTSOUND, POLICIES_KEY);
AddOptionReg(plvItem, TEXT("Disable WinSock2"), 1, 0, REGVAL_DISABLE_WINSOCK2, NACOBJECT_KEY, HKEY_LOCAL_MACHINE);
}
VOID CDebugMenu::AddASOptions(LV_ITEM * plvItem)
{
AddOptionSection(plvItem, TEXT("____Application Sharing____"));
AddOptionReg(plvItem, TEXT("Hatch Screen Data"), 1, 0, REGVAL_AS_HATCHSCREENDATA, AS_DEBUG_KEY, HKEY_LOCAL_MACHINE);
AddOptionReg(plvItem, TEXT("Hatch Bitmap Orders"), 1, 0, REGVAL_AS_HATCHBMPORDERS, AS_DEBUG_KEY, HKEY_LOCAL_MACHINE);
AddOptionCompress(plvItem, TEXT("Disable AS persist compression"), GCT_PERSIST_PKZIP, FALSE),
AddOptionCompress(plvItem, TEXT("Disable AS compression"), GCT_PKZIP, FALSE);
AddOptionReg(plvItem, TEXT("View own shared apps"), 1, 0, REGVAL_AS_VIEWSELF, AS_DEBUG_KEY, HKEY_LOCAL_MACHINE);
AddOptionReg(plvItem, TEXT("No AS Flow Control"), 1, 0, REGVAL_AS_NOFLOWCONTROL, AS_DEBUG_KEY, HKEY_LOCAL_MACHINE);
AddOptionReg(plvItem, TEXT("Disable OM compression"), 1, 0, REGVAL_OM_NOCOMPRESSION, AS_DEBUG_KEY, HKEY_LOCAL_MACHINE);
}
VOID CDebugMenu::AddUIOptions(LV_ITEM * plvItem)
{
AddOptionSection(plvItem, TEXT("____User Interface____"));
AddOptionReg(plvItem, TEXT("Call Progress TopMost"), 1, DEFAULT_DBG_CALLTOP, REGVAL_DBG_CALLTOP, DEBUG_KEY, HKEY_LOCAL_MACHINE);
AddOptionPdw(plvItem, TEXT("Display Frames Per Second"), 1, &g_fDisplayFPS);
AddOptionPdw(plvItem, TEXT("Display View Status"), 1, &g_fDisplayViewStatus);
AddOptionReg(plvItem, TEXT("Right to Left Layout"), 1, DEFAULT_DBG_RTL, REGVAL_DBG_RTL, DEBUG_KEY, HKEY_LOCAL_MACHINE);
AddOptionReg(plvItem, TEXT("Fake CallTo"), 1, DEFAULT_DBG_FAKE_CALLTO, REGVAL_DBG_FAKE_CALLTO, DEBUG_KEY, HKEY_LOCAL_MACHINE);
AddOptionSection(plvItem, TEXT("____Place a Call____"));
AddOptionPdw(plvItem, TEXT("No ILS Filter"), nmDlgCallNoFilter, &g_dwPlaceCall);
AddOptionPdw(plvItem, TEXT("No Server Edit"), nmDlgCallNoServerEdit,&g_dwPlaceCall);
AddOptionPdw(plvItem, TEXT("No ILS View"), nmDlgCallNoIls, &g_dwPlaceCall);
#if USE_GAL
AddOptionPdw(plvItem, TEXT("No GAL View"), nmDlgCallNoGal, &g_dwPlaceCall);
#endif // #if USE_GAL
AddOptionPdw(plvItem, TEXT("No WAB View"), nmDlgCallNoWab, &g_dwPlaceCall);
AddOptionPdw(plvItem, TEXT("No Speed Dial View"), nmDlgCallNoSpeedDial, &g_dwPlaceCall);
AddOptionPdw(plvItem, TEXT("No History View"), nmDlgCallNoHistory, &g_dwPlaceCall);
}
/* T O G G L E O P T I O N */
/*----------------------------------------------------------------------------
%%Function: ToggleOption
Toggle the checkbox for an option
----------------------------------------------------------------------------*/
VOID CDebugMenu::ToggleOption(LV_ITEM * plvI)
{
UINT state = plvI->state & LVIS_STATEIMAGEMASK;
if (0 == state)
return; // nothing to toggle
plvI->state &= ~LVIS_STATEIMAGEMASK;
if (state == (UINT) INDEXTOSTATEIMAGEMASK(iDbgChecked))
{
((CDebugOption *) (plvI->lParam))->m_bst = BST_UNCHECKED;
plvI->state |= INDEXTOSTATEIMAGEMASK(iDbgUnchecked);
}
else
{
((CDebugOption *) (plvI->lParam))->m_bst = BST_CHECKED;
plvI->state |= INDEXTOSTATEIMAGEMASK(iDbgChecked);
}
if (!ListView_SetItem(m_hwndDbgopt, plvI))
{
ERROR_OUT(("error setting listview item info"));
}
}
/* S A V E O P T I O N S D A T A */
/*----------------------------------------------------------------------------
%%Function: SaveOptionsData
Save all of the data by calling the Update routine of each item
----------------------------------------------------------------------------*/
BOOL CDebugMenu::SaveOptionsData(HWND hDlg)
{
LV_ITEM lvI;
ZeroMemory(&lvI, sizeof(lvI));
lvI.mask = LVIF_PARAM | LVIF_STATE;
lvI.stateMask = LVIS_STATEIMAGEMASK;
while (ListView_GetItem(m_hwndDbgopt, &lvI))
{
CDebugOption * pDbgOpt = (CDebugOption *) lvI.lParam;
if (NULL != pDbgOpt)
{
pDbgOpt->Update();
}
lvI.iItem++;
}
return TRUE;
}
/* F R E E O P T I O N S D A T A */
/*----------------------------------------------------------------------------
%%Function: FreeOptionsData
Free any allocated data associated with the options list
----------------------------------------------------------------------------*/
VOID CDebugMenu::FreeOptionsData(HWND hDlg)
{
LV_ITEM lvI;
ZeroMemory(&lvI, sizeof(lvI));
// lvI.iItem = 0;
// lvI.iSubItem = 0;
lvI.mask = LVIF_PARAM | LVIF_STATE;
lvI.stateMask = LVIS_STATEIMAGEMASK;
while (ListView_GetItem(m_hwndDbgopt, &lvI))
{
CDebugOption * pDbgOpt = (CDebugOption *) lvI.lParam;
if (NULL != pDbgOpt)
{
delete pDbgOpt;
}
lvI.iItem++;
}
}
/* O N N O T I F Y D B G O P T */
/*----------------------------------------------------------------------------
%%Function: OnNotifyDbgopt
Handle any notifications for the debug options dialog
----------------------------------------------------------------------------*/
VOID CDebugMenu::OnNotifyDbgopt(LPARAM lParam)
{
NM_LISTVIEW FAR * lpnmlv = (NM_LISTVIEW FAR *)lParam;
ASSERT(NULL != lpnmlv);
switch (lpnmlv->hdr.code)
{
case LVN_KEYDOWN:
{
LV_ITEM lvI;
LV_KEYDOWN * lplvkd = (LV_KEYDOWN *)lParam;
if (lplvkd->wVKey == VK_SPACE)
{
ZeroMemory(&lvI, sizeof(lvI));
lvI.iItem = ListView_GetNextItem(m_hwndDbgopt, -1, LVNI_FOCUSED|LVNI_SELECTED);
// lvI.iSubItem = 0;
lvI.mask = LVIF_PARAM | LVIF_STATE;
lvI.stateMask = LVIS_STATEIMAGEMASK;
if (ListView_GetItem(m_hwndDbgopt, &lvI))
{
ToggleOption(&lvI);
}
}
break;
}
case NM_DBLCLK:
case NM_CLICK:
{
LV_ITEM lvI;
LV_HITTESTINFO lvH;
int idx;
ZeroMemory(&lvH, sizeof(lvH));
GetCursorPos(&lvH.pt);
ScreenToClient(m_hwndDbgopt, &lvH.pt);
if ((NM_CLICK == lpnmlv->hdr.code) && ((UINT) lvH.pt.x) > 16)
break;
idx = ListView_HitTest(m_hwndDbgopt, &lvH);
if (-1 == idx)
break;
ZeroMemory(&lvI, sizeof(lvI));
lvI.iItem = idx;
// lvI.iSubItem = 0;
lvI.stateMask = LVIS_STATEIMAGEMASK;
lvI.mask = LVIF_PARAM | LVIF_STATE;
if (ListView_GetItem(m_hwndDbgopt, &lvI))
{
ToggleOption(&lvI);
}
break;
}
default:
break;
}
}
/* D L G O P T I O N S M S G */
/*----------------------------------------------------------------------------
%%Function: DlgOptionsMsg
----------------------------------------------------------------------------*/
BOOL CDebugMenu::DlgOptionsMsg(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDB_SHOWDBG:
{
ShowDbgView();
return TRUE;
}
case IDOK:
SaveOptionsData(hwnd);
SetDebugOutputFlags(_dwDebugModuleFlags);
SetDbgFlags();
UpdateCrtDbgSettings();
SaveNmDebugOptions();
// fall thru to IDCANCEL
case IDCANCEL:
{
FreeOptionsData(hwnd);
EndDialog(hwnd, LOWORD(wParam));
return TRUE;
}
default:
break;
} /* switch (wParam) */
break;
} /* WM_COMMAND */
case WM_NOTIFY:
if (IDL_DEBUG == wParam)
OnNotifyDbgopt(lParam);
break;
default:
break;
} /* switch (uMsg) */
return FALSE;
}
CDebugOption::CDebugOption()
{
}
CDebugOption::CDebugOption(PTSTR psz, int bst)
{
m_psz = psz;
m_bst = bst;
}
CDebugOption::~CDebugOption()
{
}
VOID CDebugOption::Update(void)
{
}
DBGOPTPDW::DBGOPTPDW(PTSTR psz, DWORD dwMask, DWORD * pdw)
: CDebugOption(psz)
{
m_psz = psz;
m_dwMask = dwMask;
m_pdw =pdw;
m_bst = IS_FLAG_SET(*m_pdw, m_dwMask) ? BST_CHECKED : BST_UNCHECKED;
}
void DBGOPTPDW::Update(void)
{
if (BST_CHECKED == m_bst)
SET_FLAG(*m_pdw, m_dwMask);
else if (BST_UNCHECKED == m_bst)
CLEAR_FLAG(*m_pdw, m_dwMask);
}
DBGOPTREG::DBGOPTREG(PTSTR psz, DWORD dwMask, DWORD dwDefault,
PTSTR pszEntry, PTSTR pszSubKey, HKEY hkey)
: CDebugOption(psz)
{
m_psz = psz;
m_dwMask = dwMask;
m_dwDefault = dwDefault;
m_pszEntry = pszEntry;
m_pszSubKey = pszSubKey;
m_hkey = hkey;
RegEntry re(m_pszSubKey, m_hkey);
DWORD dw = re.GetNumber(m_pszEntry, m_dwDefault);
m_bst = IS_FLAG_SET(dw, m_dwMask) ? BST_CHECKED : BST_UNCHECKED;
};
DBGOPTREG::~DBGOPTREG()
{
}
void DBGOPTREG::Update(void)
{
RegEntry re(m_pszSubKey, m_hkey);
DWORD dw = re.GetNumber(m_pszEntry, m_dwDefault);
if (BST_CHECKED == m_bst)
SET_FLAG(dw, m_dwMask);
else if (BST_UNCHECKED == m_bst)
CLEAR_FLAG(dw, m_dwMask);
re.SetValue(m_pszEntry, dw);
}
DBGOPTCOMPRESS::DBGOPTCOMPRESS(PTSTR psz, DWORD dwMask, BOOL bCheckedOn)
: CDebugOption(psz)
{
m_psz = psz;
m_total++; // count how many instances we are creating
m_dwMask = dwMask;
m_bCheckedOn = bCheckedOn;
RegEntry re(m_pszSubKey, m_hkey);
if (m_total == 1) // we only need to read the registry entry once
m_dwCompression = re.GetNumber(m_pszEntry, m_dwDefault);
if (m_bCheckedOn == TRUE) // check or uncheck the box depending on the semantics
m_bst = IS_FLAG_SET(m_dwCompression, m_dwMask) ? BST_CHECKED : BST_UNCHECKED;
else
m_bst = IS_FLAG_SET(m_dwCompression, m_dwMask) ? BST_UNCHECKED : BST_CHECKED;
}
void DBGOPTCOMPRESS::Update(void)
{
m_count++; // count number of times this function has been executed
if (m_bCheckedOn == TRUE)
{ // set or clear flag depending on semantics and whether the
if (BST_CHECKED == m_bst) // user checked the option box
SET_FLAG(m_dwCompression, m_dwMask);
else if (BST_UNCHECKED == m_bst)
CLEAR_FLAG(m_dwCompression, m_dwMask);
}
else
{
if (BST_CHECKED == m_bst)
CLEAR_FLAG(m_dwCompression, m_dwMask);
else if (BST_UNCHECKED == m_bst)
SET_FLAG(m_dwCompression, m_dwMask);
}
if (m_count == m_total)
{ // if this is the last call, time to update the registry
// If only GCT_PERSIST_PKZIP is set, then that means the user checked "Disable compression",
// so set compression to GCT_NOCOMPRESSION
if (GCT_PERSIST_PKZIP == m_dwCompression)
m_dwCompression = GCT_NOCOMPRESSION;
RegEntry re(m_pszSubKey, m_hkey);
// If user has left everything at default, then simply delete the registry entry.
if (m_dwCompression != GCT_DEFAULT)
re.SetValue(m_pszEntry, m_dwCompression);
else
re.DeleteValue(m_pszEntry);
}
}
/////////////////////////////////////////////////////////////////////////////
// D I A L O G: Z O N E S
/////////////////////////////////////////////////////////////////////////////
VOID CDebugMenu::DbgChangeZones(VOID)
{
DialogBoxParam(GetInstanceHandle(), MAKEINTRESOURCE(IDD_DBG_OPTIONS),
m_hwnd, CDebugMenu::DbgZonesDlgProc, (LPARAM) this);
}
INT_PTR CALLBACK CDebugMenu::DbgZonesDlgProc(HWND hDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
if (WM_INITDIALOG == uMsg)
{
if (NULL == lParam)
return FALSE;
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
((CDebugMenu *) lParam)->InitOptionsDlg(hDlg);
((CDebugMenu *) lParam)->InitZonesData(hDlg);
return TRUE;
}
CDebugMenu * ppd = (CDebugMenu*) GetWindowLongPtr(hDlg, DWLP_USER);
if (NULL == ppd)
return FALSE;
return ppd->DlgZonesMsg(hDlg, uMsg, wParam, lParam);
}
BOOL CDebugMenu::DlgZonesMsg(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDB_SHOWDBG:
{
ShowDbgView();
return TRUE;
}
case IDOK:
SaveOptionsData(hwnd);
SaveZonesData();
SetDbgFlags();
// fall thru to IDCANCEL
case IDCANCEL:
{
FreeOptionsData(hwnd);
EndDialog(hwnd, LOWORD(wParam));
return TRUE;
}
default:
break;
} /* switch (wParam) */
break;
} /* WM_COMMAND */
case WM_NOTIFY:
if (IDL_DEBUG == wParam)
OnNotifyDbgopt(lParam);
break;
default:
break;
} /* switch (uMsg) */
return FALSE;
}
VOID CDebugMenu::InitZonesData(HWND hDlg)
{
LV_ITEM lvI;
// Fill in the LV_ITEM structure
// The mask specifies the the .pszText, .iImage, .lParam and .state
// members of the LV_ITEM structure are valid.
ZeroMemory(&lvI, sizeof(lvI));
lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
lvI.stateMask = LVIS_STATEIMAGEMASK;
lvI.cchTextMax = 256;
AddZones(&lvI);
SetWindowText(hDlg, TEXT("Debug Zone Settings"));
}
VOID CDebugMenu::AddZones(LV_ITEM * plvItem)
{
PDBGZONEINFO prgZones;
PDBGZONEINFO pZone;
UINT cModules;
UINT iModule;
UINT iZone;
UINT cch;
TCHAR sz[256];
PTCHAR pch;
if ((!NmDbgGetAllZoneParams(&prgZones, &cModules)) || (0 == cModules))
return; // no zones?
for (iModule = 0; iModule < cModules; iModule++)
{
pZone = &prgZones[iModule];
AddOptionSection(plvItem, TEXT("----------------------------------------"));
lstrcpy(sz, pZone->pszModule);
cch = lstrlen(sz);
if (0 == cch)
continue;
for (pch = sz + cch-1; _T(' ') == *pch; pch--)
;
lstrcpy(++pch, TEXT(": "));
pch += 2;
for (iZone = 0; (iZone < MAXNUM_OF_ZONES) && (*(pZone->szZoneNames[iZone])); iZone++)
{
lstrcpy(pch, pZone->szZoneNames[iZone]);
AddOptionPdw(plvItem, sz, 1 << iZone, &pZone->ulZoneMask);
}
}
NmDbgFreeZoneParams(prgZones);
}
VOID CDebugMenu::SaveZonesData(VOID)
{
RegEntry reZones(ZONES_KEY, HKEY_LOCAL_MACHINE);
PDBGZONEINFO prgZones;
UINT cModules;
UINT iModule;
if ((!NmDbgGetAllZoneParams(&prgZones, &cModules)) || (0 == cModules))
return; // no zones?
for (iModule = 0; iModule < cModules; iModule++)
{
reZones.SetValue(prgZones[iModule].pszModule, prgZones[iModule].ulZoneMask);
}
NmDbgFreeZoneParams(prgZones);
}
/////////////////////////////////////////////////////////////////////////////
// D I A L O G: S Y S P O L I C Y
/////////////////////////////////////////////////////////////////////////////
VOID CDebugMenu::DbgSysPolicy(VOID)
{
DialogBoxParam(GetInstanceHandle(), MAKEINTRESOURCE(IDD_DBG_OPTIONS),
m_hwnd, CDebugMenu::DbgPolicyDlgProc, (LPARAM) this);
}
INT_PTR CALLBACK CDebugMenu::DbgPolicyDlgProc(HWND hDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
if (WM_INITDIALOG == uMsg)
{
if (NULL == lParam)
return FALSE;
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
((CDebugMenu *) lParam)->InitOptionsDlg(hDlg);
((CDebugMenu *) lParam)->InitPolicyData(hDlg);
return TRUE;
}
CDebugMenu * ppd = (CDebugMenu*) GetWindowLongPtr(hDlg, DWLP_USER);
if (NULL == ppd)
return FALSE;
return ppd->DlgPolicyMsg(hDlg, uMsg, wParam, lParam);
}
BOOL CDebugMenu::DlgPolicyMsg(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDOK:
SaveOptionsData(hwnd);
// fall thru to IDCANCEL
case IDCANCEL:
FreeOptionsData(hwnd);
EndDialog(hwnd, LOWORD(wParam));
return TRUE;
default:
break;
} /* switch (wParam) */
break;
} /* WM_COMMAND */
case WM_NOTIFY:
if (IDL_DEBUG == wParam)
OnNotifyDbgopt(lParam);
break;
default:
break;
} /* switch (uMsg) */
return FALSE;
}
VOID CDebugMenu::InitPolicyData(HWND hDlg)
{
LV_ITEM lvI;
ZeroMemory(&lvI, sizeof(lvI));
lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
lvI.stateMask = LVIS_STATEIMAGEMASK;
lvI.cchTextMax = 256;
AddPolicyOptions(&lvI);
ShowWindow(GetDlgItem(hDlg, IDB_SHOWDBG), SW_HIDE);
SetWindowText(hDlg, TEXT("System Policies"));
}
/////////////////////////////////////////////////////////////////////////////
// D I A L O G: U S E R I N T E R F A C E
/////////////////////////////////////////////////////////////////////////////
VOID CDebugMenu::DbgUI(VOID)
{
DialogBoxParam(GetInstanceHandle(), MAKEINTRESOURCE(IDD_DBG_OPTIONS),
m_hwnd, CDebugMenu::DbgUIDlgProc, (LPARAM) this);
}
INT_PTR CALLBACK CDebugMenu::DbgUIDlgProc(HWND hDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
if (WM_INITDIALOG == uMsg)
{
if (NULL == lParam)
return FALSE;
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
((CDebugMenu *) lParam)->InitOptionsDlg(hDlg);
((CDebugMenu *) lParam)->InitUIData(hDlg);
return TRUE;
}
CDebugMenu * ppd = (CDebugMenu*) GetWindowLongPtr(hDlg, DWLP_USER);
if (NULL == ppd)
return FALSE;
return ppd->DlgPolicyMsg(hDlg, uMsg, wParam, lParam);
}
VOID CDebugMenu::InitUIData(HWND hDlg)
{
LV_ITEM lvI;
ZeroMemory(&lvI, sizeof(lvI));
lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
lvI.stateMask = LVIS_STATEIMAGEMASK;
lvI.cchTextMax = 256;
AddUIOptions(&lvI);
ShowWindow(GetDlgItem(hDlg, IDB_SHOWDBG), SW_HIDE);
SetWindowText(hDlg, TEXT("User Interface"));
}
/////////////////////////////////////////////////////////////////////////////
// D I A L O G: V E R S I O N
/////////////////////////////////////////////////////////////////////////////
/****************************************************************************
*
* CLASS: CDebugMenu
*
* MEMBER: DbgVersion()
*
* PURPOSE: Brings up the debug options dialog box
*
****************************************************************************/
VOID CDebugMenu::DbgVersion(VOID)
{
if (SUCCEEDED(DLLVER::Init()))
{
DialogBoxParam(GetInstanceHandle(), MAKEINTRESOURCE(IDD_DBG_VERSION),
m_hwnd, CDebugMenu::DbgVersionDlgProc, (LPARAM) this);
}
}
/****************************************************************************
*
* CLASS: CDebugMenu
*
* MEMBER: DbgVersionDlgProc()
*
* PURPOSE: Dialog Proc for version information
*
****************************************************************************/
INT_PTR CALLBACK CDebugMenu::DbgVersionDlgProc(HWND hDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
if (WM_INITDIALOG == uMsg)
{
if (NULL == lParam)
return FALSE;
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
((CDebugMenu *) lParam)->InitVerDlg(hDlg);
return TRUE;
}
CDebugMenu * ppd = (CDebugMenu*) GetWindowLongPtr(hDlg, DWLP_USER);
if (NULL == ppd)
return FALSE;
return ppd->DlgVersionMsg(hDlg, uMsg, wParam, lParam);
}
/****************************************************************************
*
* CLASS: CDebugMenu
*
* MEMBER: DlgVersionMsg()
*
* PURPOSE: processes all messages except WM_INITDIALOG
*
****************************************************************************/
BOOL CDebugMenu::DlgVersionMsg(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_DBG_VER_OPRAH:
case IDC_DBG_VER_AUDIO:
case IDC_DBG_VER_WINDOWS:
FillVerList(hwnd);
return TRUE;
case IDOK:
case IDCANCEL:
{
EndDialog(hwnd, LOWORD(wParam));
return TRUE;
}
default:
break;
} /* switch (wParam) */
break;
} /* WM_COMMAND */
#ifdef NOTUSED
case WM_NOTIFY:
{
if (IDL_DBG_VERINFO != wParam)
break;
NM_LISTVIEW * pnmv = (NM_LISTVIEW *) lParam;
if (pnmv->hdr.code == LVN_COLUMNCLICK)
{
ASSERT(pnmv->hdr.hwndFrom == GetDlgItem(hwnd, IDL_DBG_VERINFO));
SortVerList(pnmv->hdr.hwndFrom, pnmv->iSubItem);
}
break;
}
#endif /* NOTUSED */
default:
break;
} /* switch (uMsg) */
return FALSE;
}
/* I N I T V E R D L G */
/*----------------------------------------------------------------------------
%%Function: InitVerDlg
----------------------------------------------------------------------------*/
BOOL CDebugMenu::InitVerDlg(HWND hDlg)
{
LV_COLUMN lvc;
int iCol;
HWND hwnd;
ASSERT(NULL != hDlg);
hwnd = GetDlgItem(hDlg, IDL_DBG_VERINFO);
ListView_SetExtendedListViewStyle(hwnd, LVS_EX_FULLROWSELECT);
for (int i = 0; i < ARRAY_ELEMENTS(_rgModules); i++)
CheckDlgButton(hDlg, _rgModules[i].id , _rgModules[i].fShow);
// Set up columns
ZeroMemory(&lvc, sizeof(lvc));
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
for (iCol = 0; iCol < cVerInfo; iCol++)
{
lvc.iSubItem = iCol;
lvc.pszText = _rgVerTitle[iCol];
lvc.cx = _rgVerWidth[iCol];
lvc.fmt = (iCol == 1) ? LVCFMT_RIGHT : LVCFMT_LEFT;
ListView_InsertColumn(hwnd, iCol, &lvc);
}
return FillVerList(hDlg);
}
/* F I L L V E R L I S T */
/*----------------------------------------------------------------------------
%%Function: FillVerList
----------------------------------------------------------------------------*/
BOOL CDebugMenu::FillVerList(HWND hDlg)
{
HWND hwnd;
ASSERT(NULL != hDlg);
hwnd = GetDlgItem(hDlg, IDL_DBG_VERINFO);
ghwndVerList = hwnd;
ListView_DeleteAllItems(hwnd);
for (int i = 0; i < ARRAY_ELEMENTS(_rgModules); i++)
{
_rgModules[i].fShow = IsDlgButtonChecked(hDlg, _rgModules[i].id);
if (_rgModules[i].fShow)
ShowVerInfo(hwnd, _rgModules[i].rgsz, _rgModules[i].cFiles);
}
return TRUE;
}
/* S H O W V E R I N F O */
/*----------------------------------------------------------------------------
%%Function: ShowVerInfo
----------------------------------------------------------------------------*/
VOID CDebugMenu::ShowVerInfo(HWND hwnd, LPTSTR * rgsz, int cFiles)
{
int iCol;
int iPos;
DWORD dw;
DWORD dwSize;
UINT cbBytes;
TCHAR rgch[2048]; // a really big buffer;
TCHAR szField[256];
TCHAR szDir[MAX_PATH];
LPTSTR lpszVerIntl;
LPTSTR lpsz;
LV_ITEM lvItem;
HANDLE hFind;
WIN32_FIND_DATA findData;
SYSTEMTIME sysTime;
// Get and set data for each line
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_TEXT;
lvItem.iItem = ListView_GetItemCount(hwnd);
ListView_SetItemCount(hwnd, lvItem.iItem + cFiles);
GetInstallDirectory(szDir);
for (int i = 0; i < cFiles; i++, lvItem.iItem++)
{
lvItem.pszText = rgsz[i];
lvItem.cchTextMax = lstrlen(lvItem.pszText);
lvItem.lParam = lvItem.iItem;
iPos = ListView_InsertItem(hwnd, &lvItem);
// Find file and get attributes (size and creation date)
wsprintf(rgch, TEXT("%s%s"), szDir, lvItem.pszText);
hFind = FindFirstFile(rgch, &findData);
if (INVALID_HANDLE_VALUE == hFind)
{
GetSystemDirectory(rgch, sizeof(rgch));
lstrcat(rgch, TEXT("\\"));
lstrcat(rgch, lvItem.pszText);
hFind = FindFirstFile(rgch, &findData);
}
if (INVALID_HANDLE_VALUE == hFind)
{
ZeroMemory(&findData, sizeof(findData));
ListView_SetItemText(hwnd, iPos, 1, TEXT("-"));
ListView_SetItemText(hwnd, iPos, 2, TEXT("-"));
}
else
{
FindClose(hFind);
wsprintf(szField, TEXT("%d"), findData.nFileSizeLow);
ListView_SetItemText(hwnd, iPos, 1, szField);
FileTimeToSystemTime(&findData.ftLastWriteTime, &sysTime);
wsprintf(szField, TEXT("%d/%02d/%02d"), sysTime.wYear, sysTime.wMonth, sysTime.wDay);
ListView_SetItemText(hwnd, iPos, 2, szField);
}
// Get version information
dwSize = DLLVER::GetFileVersionInfoSize(lvItem.pszText, &dw);
if ((0 == dwSize) || (sizeof(rgch) < dwSize) ||
!DLLVER::GetFileVersionInfo(lvItem.pszText, dw, dwSize, rgch))
{
continue;
}
// attempt to determine intl version ("040904E4" or "040904B0")
wsprintf(szField, _szVerFormat, _szStringFileInfo, _szVerIntlUSA, _rgszVerInfo[VERSION_INDEX]);
if (DLLVER::VerQueryValue(rgch, szField, (LPVOID *) &lpsz, &cbBytes))
lpszVerIntl = _szVerIntlUSA;
else
lpszVerIntl = _szVerIntlAlt;
// FUTURE display the language/code page info
for (iCol = 3; iCol < cVerInfo; iCol++)
{
wsprintf(szField, _szVerFormat, _szStringFileInfo, lpszVerIntl, _rgszVerInfo[iCol]);
if (!DLLVER::VerQueryValue(rgch, szField, (LPVOID *) &lpsz, &cbBytes))
lpsz = TEXT("-");
ListView_SetItemText(hwnd, iPos, iCol, lpsz);
}
}
}
/////////////////////////////////////////////////////////////////////////////
// D I A L O G: M E M B E R
/////////////////////////////////////////////////////////////////////////////
static DWSTR _rgColMember[] = {
80, TEXT("Name"),
30, TEXT("Ver"),
65, TEXT("GccId"),
65, TEXT("Parent"),
60, TEXT("Flags"),
40, TEXT("Send"),
40, TEXT("Recv"),
45, TEXT("Using"),
90, TEXT("IP"),
80, TEXT("Email"),
120, TEXT("ULS"),
};
enum {
ICOL_PART_NAME = 0,
ICOL_PART_VER,
ICOL_PART_GCCID,
ICOL_PART_PARENT,
ICOL_PART_FLAGS,
ICOL_PART_CAPS_SEND,
ICOL_PART_CAPS_RECV,
ICOL_PART_CAPS_INUSE,
ICOL_PART_IP,
ICOL_PART_EMAIL,
ICOL_PART_ULS,
};
VOID CDebugMenu::DbgMemberInfo(VOID)
{
DialogBoxParam(GetInstanceHandle(), MAKEINTRESOURCE(IDD_DBG_LIST),
m_hwnd, CDebugMenu::DbgListDlgProc, (LPARAM) this);
}
VOID CDebugMenu::InitMemberDlg(HWND hDlg)
{
LV_COLUMN lvc;
int iCol;
HWND hwnd;
ASSERT(NULL != hDlg);
hwnd = GetDlgItem(hDlg, IDL_DBG_LIST);
ListView_SetExtendedListViewStyle(hwnd, LVS_EX_FULLROWSELECT);
// Set up columns
ZeroMemory(&lvc, sizeof(lvc));
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
for (iCol = 0; iCol < ARRAY_ELEMENTS(_rgColMember); iCol++)
{
lvc.iSubItem = iCol;
lvc.pszText = _rgColMember[iCol].psz;
lvc.cx = _rgColMember[iCol].dw;
ListView_InsertColumn(hwnd, iCol, &lvc);
}
FillMemberList(hDlg);
SetWindowText(hDlg, TEXT("Member Information"));
}
VOID CDebugMenu::FillMemberList(HWND hDlg)
{
HWND hwnd;
ASSERT(NULL != hDlg);
hwnd = GetDlgItem(hDlg, IDL_DBG_LIST);
ListView_DeleteAllItems(hwnd);
CConfRoom * pcr = ::GetConfRoom();
if (NULL == pcr)
return;
CSimpleArray<CParticipant*>& rMemberList = pcr->GetParticipantList();
for( int i = 0; i < rMemberList.GetSize(); ++i )
{
ASSERT( rMemberList[i] );
ShowMemberInfo( hwnd, rMemberList[i] );
}
}
VOID CDebugMenu::ShowMemberInfo(HWND hwnd, CParticipant * pPart)
{
HRESULT hr;
ULONG ul;
int iPos;
LV_ITEM lvItem;
TCHAR sz[MAX_PATH];
if (NULL == pPart)
return;
// Get and set data for each line
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_TEXT;
lvItem.pszText = pPart->GetPszName();
lvItem.cchTextMax = lstrlen(lvItem.pszText);
lvItem.lParam = (LPARAM) pPart;
iPos = ListView_InsertItem(hwnd, &lvItem);
wsprintf(sz, TEXT("%08X"), pPart->GetGccId());
ListView_SetItemText(hwnd, iPos, ICOL_PART_GCCID, sz);
INmMember * pMember = pPart->GetINmMember();
if (NULL != pMember)
{
hr = pMember->GetNmVersion(&ul);
wsprintf(sz, "%d", ul);
ListView_SetItemText(hwnd, iPos, ICOL_PART_VER, sz);
wsprintf(sz, TEXT("%08X"), ((CNmMember *) pMember)->GetGccIdParent());
ListView_SetItemText(hwnd, iPos, ICOL_PART_PARENT, sz);
}
lstrcpy(sz, TEXT("?"));
hr = pPart->GetIpAddr(sz, CCHMAX(sz));
ListView_SetItemText(hwnd, iPos, ICOL_PART_IP, sz);
lstrcpy(sz, TEXT("?"));
hr = pPart->GetUlsAddr(sz, CCHMAX(sz));
ListView_SetItemText(hwnd, iPos, ICOL_PART_ULS, sz);
lstrcpy(sz, TEXT("?"));
hr = pPart->GetEmailAddr(sz, CCHMAX(sz));
ListView_SetItemText(hwnd, iPos, ICOL_PART_EMAIL, sz);
DWORD dwFlags = pPart->GetDwFlags();
wsprintf(sz, TEXT("%s%s%s%s %s%s%s"),
dwFlags & PF_T120 ? "D" : "",
dwFlags & PF_H323 ? "H" : "",
dwFlags & PF_MEDIA_AUDIO ? "A" : "",
dwFlags & PF_MEDIA_VIDEO ? "V" : "",
pPart->FLocal() ? "L" : "",
pPart->FMcu() ? "M" : "",
dwFlags & PF_T120_TOP_PROV ? "T" : "");
ListView_SetItemText(hwnd, iPos, ICOL_PART_FLAGS, sz);
DWORD uCaps = pPart->GetDwCaps();
wsprintf(sz, TEXT("%s%s"),
uCaps & CAPFLAG_SEND_AUDIO ? "A" : "",
uCaps & CAPFLAG_SEND_VIDEO ? "V" : "");
ListView_SetItemText(hwnd, iPos, ICOL_PART_CAPS_SEND, sz);
wsprintf(sz, TEXT("%s%s"),
uCaps & CAPFLAG_RECV_AUDIO ? "A" : "",
uCaps & CAPFLAG_RECV_VIDEO ? "V" : "");
ListView_SetItemText(hwnd, iPos, ICOL_PART_CAPS_RECV, sz);
wsprintf(sz, TEXT("%s%s%s%s"),
uCaps & CAPFLAG_DATA_IN_USE ? "D" : "",
uCaps & CAPFLAG_AUDIO_IN_USE ? "A" : "",
uCaps & CAPFLAG_VIDEO_IN_USE ? "V" : "",
uCaps & CAPFLAG_H323_IN_USE ? "H" : "");
ListView_SetItemText(hwnd, iPos, ICOL_PART_CAPS_INUSE, sz);
if (pPart->FLocal())
{
ListView_SetItemState(hwnd, iPos, LVIS_FOCUSED | LVIS_SELECTED, 0x000F);
}
}
INT_PTR CALLBACK CDebugMenu::DbgListDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (WM_INITDIALOG == uMsg)
{
if (NULL == lParam)
return FALSE;
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
((CDebugMenu *) lParam)->InitMemberDlg(hDlg);
return TRUE;
}
CDebugMenu * ppd = (CDebugMenu*) GetWindowLongPtr(hDlg, DWLP_USER);
if (NULL == ppd)
return FALSE;
switch (uMsg)
{
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDOK:
case IDCANCEL:
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
default:
break;
} /* switch (wParam) */
break;
} /* WM_COMMAND */
default:
break;
} /* switch (uMsg) */
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// O T H E R F U N C T I O N S
/////////////////////////////////////////////////////////////////////////////
/* D B G W I Z A R D */
/*-------------------------------------------------------------------------
%%Function: DbgWizard
-------------------------------------------------------------------------*/
VOID DbgWizard(BOOL fVisible)
{
LONG lSoundCaps = SOUNDCARD_NONE;
HRESULT hr = StartRunOnceWizard(&lSoundCaps, TRUE, fVisible);
TRACE_OUT(("StartRunOnceWizard result=%08X", hr));
}
#if defined (_M_IX86)
#define _DbgBreak() __asm { int 3 }
#else
#define _DbgBreak() DebugBreak()
#endif
VOID DbgBreak(void)
{
// Break into the debugger
_DbgBreak();
}
/////////////////////////////////////////////////////////////////////////////
// T E S T F U N C T I O N S
/////////////////////////////////////////////////////////////////////////////
#include "splash.h"
VOID DbgSplash(HWND hwnd)
{
if (NULL == g_pSplashScreen)
{
StartSplashScreen(hwnd);
}
else
{
StopSplashScreen();
}
}
VOID DbgTest2(void)
{
TRACE_OUT(("Test 2 complete"));
}
VOID DbgTest3(void)
{
TRACE_OUT(("Test 3 complete"));
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
BOOL _FEnsureDbgMenu(void)
{
if (NULL != g_pDbgMenu)
return TRUE;
g_pDbgMenu = new CDebugMenu;
return (NULL != g_pDbgMenu);
}
VOID FreeDbgMenu(void)
{
delete g_pDbgMenu;
g_pDbgMenu = NULL;
}
VOID InitDbgMenu(HWND hwnd)
{
if (_FEnsureDbgMenu())
g_pDbgMenu->InitDebugMenu(hwnd);
}
BOOL OnDebugCommand(WPARAM wCmd)
{
if (!_FEnsureDbgMenu())
return FALSE;
return g_pDbgMenu->OnDebugCommand(wCmd);
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
VOID DbgGetComments(LPTSTR psz)
{
// NetMeeting version
lstrcpy(psz, "NM3." VERSIONBUILD_STR);
// OS version
if (IsWindowsNT())
{
RegEntry re(WINDOWS_NT_KEY, HKEY_LOCAL_MACHINE);
LPTSTR pszVer = re.GetString("CurrentVersion");
if (0 == lstrcmp(pszVer, "4.0"))
{
lstrcat(psz, ", NT4 ");
}
else if (0 == lstrcmp(pszVer, "5.0"))
{
lstrcat(psz, ", NT5 ");
}
else
{
lstrcat(psz, ", NT ");
lstrcat(psz, pszVer);
}
pszVer = re.GetString("CSDVersion");
if (!FEmptySz(pszVer))
{
if (0 == lstrcmp(pszVer, "Service Pack 3"))
lstrcat(psz, "SP-3");
else
lstrcat(psz, pszVer);
}
}
else
{
RegEntry re(WINDOWS_KEY, HKEY_LOCAL_MACHINE);
LPTSTR pszVer = re.GetString("Version");
if (0 == lstrcmp(pszVer, "Windows 95"))
{
lstrcat(psz, ", Win95");
}
else if (0 == lstrcmp(pszVer, "Windows 98"))
{
lstrcat(psz, ", Win98");
}
else if (NULL != pszVer)
{
lstrcat(psz, ", ");
lstrcat(psz, pszVer);
}
}
// Internet Explorer version
{
RegEntry re(TEXT("Software\\Microsoft\\Internet Explorer"), HKEY_LOCAL_MACHINE);
lstrcat(psz, ", IE");
lstrcat(psz, re.GetString("Version"));
}
}
/////////////////////////////////////////////////////////////////////////////
#define STRING_CASE(val) case val: pcsz = #val; break
LPCTSTR PszLastError(void)
{
static TCHAR _szErr[MAX_PATH];
DWORD dwErr = GetLastError();
if (0 == FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM, // source and processing options
NULL, // pointer to message source
dwErr, // requested message identifier
0, // language identifier for requested message
_szErr, // pointer to message buffer
CCHMAX(_szErr), // maximum size of message buffer
NULL)) // address of array of message inserts
{
wsprintf(_szErr, TEXT("0x%08X (%d)"), dwErr, dwErr);
}
return _szErr;
}
LPCTSTR PszWSALastError(void)
{
LPCTSTR pcsz;
DWORD dwErr = WSAGetLastError();
switch (dwErr)
{
STRING_CASE(WSAEWOULDBLOCK);
STRING_CASE(WSAEINPROGRESS);
STRING_CASE(HOST_NOT_FOUND);
STRING_CASE(WSATRY_AGAIN);
STRING_CASE(WSANO_RECOVERY);
STRING_CASE(WSANO_DATA);
default:
{
static TCHAR _szErr[MAX_PATH];
wsprintf(_szErr, TEXT("0x%08X (%d)"), dwErr, dwErr);
pcsz = _szErr;
break;
}
}
return pcsz;
}
/* P S Z H R E S U L T */
/*-------------------------------------------------------------------------
%%Function: PszHResult
-------------------------------------------------------------------------*/
LPCTSTR PszHResult(HRESULT hr)
{
LPCSTR pcsz;
switch (hr)
{
// Common HResults
STRING_CASE(S_OK);
STRING_CASE(S_FALSE);
STRING_CASE(E_FAIL);
STRING_CASE(E_OUTOFMEMORY);
// NM COM API 2.0
STRING_CASE(NM_S_NEXT_CONFERENCE);
STRING_CASE(NM_S_ON_RESTART);
STRING_CASE(NM_CALLERR_NOT_INITIALIZED);
STRING_CASE(NM_CALLERR_MEDIA);
STRING_CASE(NM_CALLERR_NAME_RESOLUTION);
STRING_CASE(NM_CALLERR_PASSWORD);
STRING_CASE(NM_CALLERR_CONFERENCE_NAME);
STRING_CASE(NM_CALLERR_IN_CONFERENCE);
STRING_CASE(NM_CALLERR_NOT_FOUND);
STRING_CASE(NM_CALLERR_MCU);
STRING_CASE(NM_CALLERR_REJECTED);
STRING_CASE(NM_CALLERR_AUDIO);
STRING_CASE(NM_CALLERR_AUDIO_LOCAL);
STRING_CASE(NM_CALLERR_AUDIO_REMOTE);
STRING_CASE(NM_CALLERR_UNKNOWN);
STRING_CASE(NM_E_NOT_INITIALIZED);
STRING_CASE(NM_E_CHANNEL_ALREADY_EXISTS);
STRING_CASE(NM_E_NO_T120_CONFERENCE);
STRING_CASE(NM_E_NOT_ACTIVE);
// NM COM API 3.0
STRING_CASE(NM_CALLERR_LOOPBACK);
default:
pcsz = GetHRESULTString(hr);
break;
}
return pcsz;
}
/////////////////////////////////////////////////////////////////////////////
/* I N I T N M D E B U G O P T I O N S */
/*-------------------------------------------------------------------------
%%Function: InitNmDebugOptions
Initialize NetMeeting UI-specific debug options.
-------------------------------------------------------------------------*/
VOID InitNmDebugOptions(void)
{
RegEntry re(DEBUG_KEY, HKEY_LOCAL_MACHINE);
g_fDisplayFPS = re.GetNumber(REGVAL_DBG_DISPLAY_FPS, 0);
g_fDisplayViewStatus = re.GetNumber(REGVAL_DBG_DISPLAY_VIEWSTATUS, 0);
}
VOID SaveNmDebugOptions(void)
{
RegEntry re(DEBUG_KEY, HKEY_LOCAL_MACHINE);
re.SetValue(REGVAL_DBG_DISPLAY_FPS, g_fDisplayFPS);
re.SetValue(REGVAL_DBG_DISPLAY_VIEWSTATUS, g_fDisplayViewStatus);
}
/* U P D A T E C R T D B G S E T T I N G S */
/*-------------------------------------------------------------------------
%%Function: UpdateCrtDbgSettings
Update the C runtime debug memory settings
-------------------------------------------------------------------------*/
VOID UpdateCrtDbgSettings(void)
{
#if 0
// This depends on the use of the debug c runtime library
int tmpFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
// Always enable memory leak checking debug spew
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(tmpFlag);
#endif // 0
}
/* I N I T D E B U G M E M O R Y O P T I O N S */
/*-------------------------------------------------------------------------
%%Function: InitDebugMemoryOptions
Initilize the runtime memory
-------------------------------------------------------------------------*/
BOOL InitDebugMemoryOptions(void)
{
InitNmDebugOptions();
UpdateCrtDbgSettings();
#if 0
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_WNDW); // create a message box on errors
#endif // 0
return TRUE;
}
#endif /* DEBUG - whole file */