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.
242 lines
7.8 KiB
242 lines
7.8 KiB
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// File Name: fxocDbg.cpp
|
|
//
|
|
// Abstract: This provides the debug routines used in the FaxOCM
|
|
// code base.
|
|
//
|
|
// Environment: Windows XP / User Mode
|
|
//
|
|
// Copyright (c) 2000 Microsoft Corporation
|
|
//
|
|
// Revision History:
|
|
//
|
|
// Date: Developer: Comments:
|
|
// ----- ---------- ---------
|
|
// 15-Mar-2000 Oren Rosenbloom (orenr) Created
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "faxocm.h"
|
|
#pragma hdrstop
|
|
|
|
#define prv_SECTION_FAXOCMDEBUG _T("FaxOcmDebug")
|
|
#define prv_KEY_DEBUGLEVEL _T("DebugLevel")
|
|
#define prv_KEY_DEBUGFORMAT _T("DebugFormat")
|
|
|
|
#define prv_DEBUG_FILE_NAME _T("%windir%\\FaxSetup.log")
|
|
|
|
///////////////////////////////
|
|
// prv_OC_Function
|
|
//
|
|
// Type containing text description
|
|
// of stage of OC Manager
|
|
// setup.
|
|
//
|
|
typedef struct prv_OC_Function
|
|
{
|
|
UINT uiFunction;
|
|
TCHAR *pszFunctionDesc;
|
|
} prv_OC_Function;
|
|
|
|
///////////////////////////////
|
|
// prv_OC_FunctionTable
|
|
//
|
|
// This table contains the various
|
|
// stages of the OC Manager setup,
|
|
// and their text equivalent. This
|
|
// allows us to output to debug the
|
|
// stage of setup, rather than the
|
|
// numerical equivalent.
|
|
//
|
|
//
|
|
static prv_OC_Function prv_OC_FunctionTable[] =
|
|
{
|
|
{OC_PREINITIALIZE, _T("OC_PREINITIALIZE")},
|
|
{OC_INIT_COMPONENT, _T("OC_INIT_COMPONENT")},
|
|
{OC_SET_LANGUAGE, _T("OC_SET_LANGUAGE")},
|
|
{OC_QUERY_IMAGE, _T("OC_QUERY_IMAGE")},
|
|
{OC_REQUEST_PAGES, _T("OC_REQUEST_PAGES")},
|
|
{OC_QUERY_CHANGE_SEL_STATE, _T("OC_QUERY_CHANGE_SEL_STATE")},
|
|
{OC_CALC_DISK_SPACE, _T("OC_CALC_DISK_SPACE")},
|
|
{OC_QUEUE_FILE_OPS, _T("OC_QUEUE_FILE_OPS")},
|
|
{OC_NOTIFICATION_FROM_QUEUE, _T("OC_NOTIFICATION_FROM_QUEUE")},
|
|
{OC_QUERY_STEP_COUNT, _T("OC_QUERY_STEP_COUNT")},
|
|
{OC_COMPLETE_INSTALLATION, _T("OC_COMPLETE_INSTALLATION")},
|
|
{OC_CLEANUP, _T("OC_CLEANUP")},
|
|
{OC_QUERY_STATE, _T("OC_QUERY_STATE")},
|
|
{OC_NEED_MEDIA, _T("OC_NEED_MEDIA")},
|
|
{OC_ABOUT_TO_COMMIT_QUEUE, _T("OC_ABOUT_TO_COMMIT_QUEUE")},
|
|
{OC_QUERY_SKIP_PAGE, _T("OC_QUERY_SKIP_PAGE")},
|
|
{OC_WIZARD_CREATED, _T("OC_WIZARD_CREATED")},
|
|
{OC_FILE_BUSY, _T("OC_FILE_BUSY")},
|
|
{OC_EXTRA_ROUTINES, _T("OC_EXTRA_ROUTINES")}
|
|
};
|
|
#define NUM_OC_FUNCTIONS (sizeof(prv_OC_FunctionTable) / sizeof(prv_OC_FunctionTable[0]))
|
|
|
|
////////////////////////////////
|
|
// fxocDbg_InitDebug
|
|
//
|
|
// Initialize the FaxOcm
|
|
// debug subsystem.
|
|
//
|
|
// We can be turned on either
|
|
// via the [FaxOcmDebug] section
|
|
// in the faxsetup.inf, or via the
|
|
// the "DebugLevelEx" and "DebugFormatEx"
|
|
// under HKLM\Software\Microsoft\Fax
|
|
// If both are specified, the registry wins.
|
|
//
|
|
// In faxocm.inf, we look for
|
|
// [FaxOcmDebug]
|
|
// ============================
|
|
// [DebugLevel] can be one of the following:
|
|
// 0 - no debug output
|
|
// 1 - see errors only
|
|
// 2 - see errors & warnings
|
|
// 3 - see all the debug output
|
|
//
|
|
// [DebugFormat] can be one of the following:
|
|
// 0 - print to std output
|
|
// 1 - print to file ("FaxSetup.log" in %windir%\system32 directory)
|
|
// 2 - print to both
|
|
// ============================
|
|
//
|
|
// Params:
|
|
// - hFaxSetupInfHandle - handle to faxsetup.inf
|
|
// if applicable.
|
|
// Returns:
|
|
// - void.
|
|
//
|
|
void fxocDbg_Init(HINF hFaxSetupInfHandle)
|
|
{
|
|
BOOL bSuccess = FALSE;
|
|
INFCONTEXT Context;
|
|
INT iDebugLevel = 0;
|
|
INT iDebugFormat = 0;
|
|
|
|
DBG_ENTER(_T("fxocDbg_Init"),bSuccess);
|
|
memset(&Context, 0, sizeof(Context));
|
|
|
|
if (hFaxSetupInfHandle)
|
|
{
|
|
// initialize via the INF file.
|
|
|
|
// We are looking for:
|
|
// [FaxOcmDebug]
|
|
// DebugLevel = x (0 -> no debug, up to and including 3->full debug)
|
|
|
|
// find the section in the INF file and the DebugLevel key.
|
|
bSuccess = ::SetupFindFirstLine(hFaxSetupInfHandle,
|
|
prv_SECTION_FAXOCMDEBUG,
|
|
prv_KEY_DEBUGLEVEL,
|
|
&Context);
|
|
|
|
if (bSuccess)
|
|
{
|
|
// we found the DebugLevel key, so get its value.
|
|
bSuccess = ::SetupGetIntField(&Context, 1, &iDebugLevel);
|
|
if (bSuccess)
|
|
{
|
|
iDebugLevel = max(iDebugLevel,0);
|
|
iDebugLevel = min(iDebugLevel,3);
|
|
if (!IS_DEBUG_SESSION_FROM_REG)
|
|
{
|
|
switch (iDebugLevel)
|
|
{
|
|
case 0: SET_DEBUG_MASK(ASSERTION_FAILED);
|
|
break;
|
|
case 1: SET_DEBUG_MASK(DBG_ERRORS_ONLY);
|
|
break;
|
|
case 2: SET_DEBUG_MASK(DBG_ERRORS_WARNINGS);
|
|
break;
|
|
case 3: SET_DEBUG_MASK(DBG_ALL);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
memset(&Context, 0, sizeof(Context));
|
|
// find the section in the INF file and the DebugFormat key.
|
|
bSuccess = ::SetupFindFirstLine(hFaxSetupInfHandle,
|
|
prv_SECTION_FAXOCMDEBUG,
|
|
prv_KEY_DEBUGFORMAT,
|
|
&Context);
|
|
|
|
if (bSuccess)
|
|
{
|
|
// we found the DebugLevel key, so get its value.
|
|
bSuccess = ::SetupGetIntField(&Context, 1, &iDebugFormat);
|
|
if (bSuccess)
|
|
{
|
|
iDebugLevel = max(iDebugFormat,0);
|
|
iDebugLevel = min(iDebugFormat,2);
|
|
if (!IS_DEBUG_SESSION_FROM_REG)
|
|
{
|
|
switch (iDebugFormat)
|
|
{
|
|
case 0: SET_FORMAT_MASK(DBG_PRNT_ALL_TO_STD);
|
|
break;
|
|
case 1: SET_FORMAT_MASK(DBG_PRNT_ALL_TO_FILE);
|
|
OPEN_DEBUG_LOG_FILE(prv_DEBUG_FILE_NAME);
|
|
SET_DEBUG_FLUSH(FALSE);
|
|
break;
|
|
case 2: SET_FORMAT_MASK(DBG_PRNT_ALL);
|
|
OPEN_DEBUG_LOG_FILE(prv_DEBUG_FILE_NAME);
|
|
SET_DEBUG_FLUSH(FALSE);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
////////////////////////////////
|
|
// fxocDbg_TermDebug
|
|
//
|
|
// Terminate the debug subsystem
|
|
//
|
|
// Params:
|
|
// - void.
|
|
// Returns:
|
|
// - void.
|
|
//
|
|
void fxocDbg_Term(void)
|
|
{
|
|
DBG_ENTER(_T("fxocDbg_Term"));
|
|
CLOSE_DEBUG_LOG_FILE;
|
|
}
|
|
|
|
///////////////////////////////
|
|
// fxocDbg_GetOcFunction
|
|
//
|
|
// This looks up the uiFunction
|
|
// in the prv_OC_Function table
|
|
// defined above and returns a
|
|
// pointer to the text equivalent.
|
|
//
|
|
// Params:
|
|
// - uiFunction - function OC Manager wants us to perform.
|
|
// Returns:
|
|
// - text equivalent of uiFunction.
|
|
//
|
|
//
|
|
const TCHAR* fxocDbg_GetOcFunction(UINT uiFunction)
|
|
{
|
|
TCHAR *pszString = _T("");
|
|
|
|
// NOTE: This function assumes that the table above contains a
|
|
// numerically sorted array with the numerical value of
|
|
// "uiFunction" equal to its index position in the
|
|
// prv_OC_FunctionTable array. We assume this for performance
|
|
// purposes.
|
|
|
|
if (uiFunction < NUM_OC_FUNCTIONS)
|
|
{
|
|
pszString = prv_OC_FunctionTable[uiFunction].pszFunctionDesc;
|
|
}
|
|
|
|
return pszString;
|
|
}
|
|
|