////////////////////////////////////////////////////////////////////////////// // // 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; }