Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

227 lines
7.3 KiB

//=--------------------------------------------------------------------------=
// Debug.Cpp
//=--------------------------------------------------------------------------=
// Copyright 1995 Microsoft Corporation. All Rights Reserved.
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//=--------------------------------------------------------------------------=
//
// contains various methods that will only really see any use in DEBUG builds
//
#include "pch.h"
#ifdef DEBUG
#include <stdlib.h>
//=--------------------------------------------------------------------------=
// Private Constants
//---------------------------------------------------------------------------=
//
static const char szFormat[] = "%s\nFile %s, Line %d";
static const char szFormat2[] = "%s\n%s\nFile %s, Line %d";
#define _SERVERNAME_ "ActiveX Framework"
#define CTL_INI_SIZE 14
static const char szTitle[] = _SERVERNAME_ " Assertion (Abort = UAE, Retry = INT 3, Ignore = Continue)";
//=--------------------------------------------------------------------------=
// Local functions
//=--------------------------------------------------------------------------=
int NEAR _IdMsgBox(LPSTR pszText, LPCSTR pszTitle, UINT mbFlags);
//=--------------------------------------------------------------------------=
// DisplayAssert
//=--------------------------------------------------------------------------=
// Display an assert message box with the given pszMsg, pszAssert, source
// file name, and line number. The resulting message box has Abort, Retry,
// Ignore buttons with Abort as the default. Abort does a FatalAppExit;
// Retry does an int 3 then returns; Ignore just returns.
//
VOID DisplayAssert
(
LPSTR pszMsg,
LPSTR pszAssert,
LPSTR pszFile,
UINT line
)
{
LPTSTR lpszText;
char szMsg[512];
lpszText = pszMsg; // Assume no file & line # info
// If C file assert, where you've got a file name and a line #
//
if (pszFile) {
// Then format the assert nicely
//
wsprintf(szMsg, szFormat, (pszMsg&&*pszMsg) ? pszMsg : pszAssert, pszFile, line);
lpszText = szMsg;
}
// Put up a dialog box
//
switch (_IdMsgBox(lpszText, szTitle, MB_ICONHAND|MB_ABORTRETRYIGNORE|MB_SYSTEMMODAL)) {
case IDABORT:
FatalAppExit(0, lpszText);
return;
case IDRETRY:
// call the win32 api to break us.
//
DebugBreak();
return;
}
return;
}
//=---------------------------------------------------------------------------=
// Beefed-up version of WinMessageBox.
//=---------------------------------------------------------------------------=
//
int NEAR _IdMsgBox
(
LPSTR pszText,
LPCSTR pszTitle,
UINT mbFlags
)
{
HWND hwndActive;
MSG msg;
int id;
hwndActive = GetActiveWindow();
id = MessageBox(hwndActive, pszText, pszTitle, mbFlags);
if(PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE))
{
id = MessageBox(hwndActive, pszText, pszTitle, mbFlags);
PostMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);
}
return id;
}
//---------------------------------------------------------------------------
// Implementation for class CtlSwitch
//---------------------------------------------------------------------------
CtlSwitch* CtlSwitch::g_pctlswFirst = NULL;
//=---------------------------------------------------------------------------=
// CtlSwitch::InitSwitch - Initialize members and add new object to
// linked-list
//=---------------------------------------------------------------------------=
void CtlSwitch::InitSwitch
(
char * pszName
)
{
// set fields
m_pszName = pszName;
m_fSet = FALSE;
// link into global list of switches
this->m_pctlswNext = g_pctlswFirst;
g_pctlswFirst = this;
}
//=---------------------------------------------------------------------------=
// SetCtlSwitches:
// Initialize linked-list control switches to those values set in the
// corresponding .ini files
//=---------------------------------------------------------------------------=
VOID SetCtlSwitches
(
LPSTR lpCtlPath
)
{
TCHAR lpWindowsDir[128]; // Path to Windows directory
UINT uMaxWinPathSize = 128; // Max size for Win path
UINT uPathSize; // Actual Win path size
LPCTSTR lpAllSwitch = "allctls"; // Name of section which applies to all ctls
char lpszCtlName[128]; // Name of ctl (minus extension) to act as section name in INI
LPCTSTR lpFileName = "\\CtlSwtch.ini"; // Name of INI file
char lpStatus[4]; // Status of switch (on/off)
LPCTSTR lpDefaultStatus = "set"; // Default status
LPCTSTR lpTurnOff = "off";
LPCTSTR lpTurnOn = "on";
DWORD nSizeStatus = 4; // Size of status switch
DWORD fSet; // If switch is set in INI
// Create path to CtlSwtch.ini in the Windows directory
uPathSize = GetWindowsDirectory(lpWindowsDir, uMaxWinPathSize) + CTL_INI_SIZE;
lstrcat(lpWindowsDir, lpFileName);
// Create section name for control (control name minus extension)
lstrcpyn(lpszCtlName, lpCtlPath, strlen(lpCtlPath) - 3);
int curChar = strlen(lpszCtlName);
int charCount = 0;
while (lpszCtlName[curChar] != '\\')
{
curChar--;
charCount++;
}
curChar++;
lstrcpyn(lpszCtlName, &lpCtlPath[curChar], charCount);
// Use CTLSWTCH.INI to set switches. If not defined in INI file, create switch
for (CtlSwitch* pctlsw = CtlSwitch::g_pctlswFirst; pctlsw; pctlsw = pctlsw->m_pctlswNext)
{
// Specific control switches override the "allctls" switch
fSet = GetPrivateProfileString(lpszCtlName, (LPCTSTR)pctlsw->m_pszName, lpDefaultStatus, (LPTSTR)lpStatus, nSizeStatus, (LPCTSTR)lpWindowsDir);
// If switch is not set for control, use "allctls" switch
if ((fSet == 0) || (strcmp(lpStatus, "set") == 0))
{
fSet = GetPrivateProfileString(lpAllSwitch, (LPCTSTR)pctlsw->m_pszName, lpDefaultStatus, (LPTSTR)lpStatus, nSizeStatus, (LPCTSTR)lpWindowsDir);
// If INI file or switch do not exist, create one...
if ((fSet == 0) || (strcmp(lpStatus, "set") == 0))
{
// If switch was initialized TRUE, turn it on
if (pctlsw->m_fSet != 0)
WritePrivateProfileString(lpszCtlName, (LPCTSTR)pctlsw->m_pszName, (LPTSTR)lpTurnOn, (LPCTSTR)lpWindowsDir);
// Else turn it off
else
{
WritePrivateProfileString(lpAllSwitch, (LPCTSTR)pctlsw->m_pszName, (LPTSTR)lpTurnOff, (LPCTSTR)lpWindowsDir);
WritePrivateProfileString(lpszCtlName, (LPCTSTR)pctlsw->m_pszName, (LPTSTR)lpTurnOff, (LPCTSTR)lpWindowsDir);
pctlsw->m_fSet = FALSE;
}
}
else if ((strcmp(lpStatus, "on") == 0))
{
WritePrivateProfileString(lpszCtlName, (LPCTSTR)pctlsw->m_pszName, (LPTSTR)lpStatus, (LPCTSTR)lpWindowsDir);
pctlsw->m_fSet = TRUE;
}
else
{
WritePrivateProfileString(lpszCtlName, (LPCTSTR)pctlsw->m_pszName, (LPTSTR)lpTurnOff, (LPCTSTR)lpWindowsDir);
pctlsw->m_fSet = FALSE;
}
}
else if ((strcmp(lpStatus, "on") == 0))
pctlsw->m_fSet = TRUE;
else
pctlsw->m_fSet = FALSE;
}
}
#endif