// This is a part of the Active Template Library. // Copyright (C) 1996-2001 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Active Template Library Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Active Template Library product. #include "stdafx.h" #include "Common.h" #include "AtlTraceModuleManager.h" namespace ATL { void NotifyTool(); #if 0 static bool SetSettings(CAtlTraceSettings *pTraceSettings, UINT nLevel, UINT nStatus) { ATLASSERT(pTraceSettings); if(!pTraceSettings) return false; pTraceSettings->m_nLevel = nLevel; switch(nStatus) { case 0: pTraceSettings->m_eStatus = CAtlTraceSettings::Inherit; break; case 1: pTraceSettings->m_eStatus = CAtlTraceSettings::Enabled; break; case 2: default: pTraceSettings->m_eStatus = CAtlTraceSettings::Disabled; break; } return true; } static bool GetSettings(const CAtlTraceSettings &rTraceSettings, UINT *pnStatus) { ATLASSERT(pnStatus); if(!pnStatus) return false; switch(rTraceSettings.m_eStatus) { case CAtlTraceSettings::Inherit: *pnStatus = 0; break; case CAtlTraceSettings::Enabled: *pnStatus = 1; break; case CAtlTraceSettings::Disabled: default: *pnStatus = 2; break; } return true; } BOOL __stdcall AtlTraceLoadSettingsA(const CHAR *pszFileName, BOOL bForceLoad) { CAtlAllocatorLock lock(&g_Allocator); if(!lock.Locked()) return FALSE; CHAR szFileName[_MAX_PATH]; if(!pszFileName) { CHAR szDrive[_MAX_DRIVE]; CHAR szDir[_MAX_DIR]; CHAR szFName[_MAX_FNAME]; CHAR szExt[_MAX_EXT]; ::GetModuleFileNameA(NULL, szFileName, MAX_PATH); _splitpath(szFileName, szDrive, szDir, szFName, szExt); strcpy(szExt, ".trc"); _makepath(szFileName, szDrive, szDir, szFName, szExt); pszFileName = szFileName; } if(pszFileName) { if(-1 != GetFileAttributesA(pszFileName)) { // file exists CHAR szSection[MAX_PATH], szKey[MAX_PATH], szValue[MAX_PATH]; CHAR szName[MAX_PATH]; UINT nModules, nCategories, nStatus, nLevel; UINT nModule, nCategory; CAtlTraceProcess *pProcess; CAtlTraceModule *pModule; CAtlTraceCategory *pCategory; CHAR *pszProcess = "Process"; CHAR cEnabled, cFuncAndCategoryNames, cFileNameAndLineInfo; pProcess = g_Allocator.GetProcess(); ATLASSERT(pProcess); if(!pProcess) return FALSE; if(!pProcess->m_bLoaded || bForceLoad) { pProcess->m_bLoaded = true; ::GetPrivateProfileStringA(pszProcess, "Info", "", szValue, MAX_PATH, pszFileName); if(5 != sscanf(szValue, "ModuleCount:%u, Level:%u, Enabled:%c, " "FuncAndCategoryNames:%c, FileNameAndLineNo:%c", &nModules, &pProcess->m_nLevel, &cEnabled, &cFuncAndCategoryNames, &cFileNameAndLineInfo)) { return FALSE; } pProcess->m_bEnabled = cEnabled != 'f'; pProcess->m_bFuncAndCategoryNames = cFuncAndCategoryNames != 'f'; pProcess->m_bFileNameAndLineNo = cFileNameAndLineInfo != 'f'; // REVIEW: conversion in loop USES_CONVERSION; for(UINT i = 0; i < nModules; i++) { sprintf(szKey, "Module%d", i); ::GetPrivateProfileStringA(pszProcess, szKey, "", szSection, MAX_PATH, pszFileName); ::GetPrivateProfileStringA(szSection, "Name", "", szName, MAX_PATH, pszFileName); if(!g_Allocator.FindModule(A2W(szName), &nModule)) continue; pModule = g_Allocator.GetModule(nModule); ATLASSERT(pModule); if(!pModule) return FALSE; ::GetPrivateProfileStringA(szSection, "Settings", "", szValue, MAX_PATH, pszFileName); if(3 != sscanf(szValue, "CategoryCount:%u, Level:%u, Status:%u", &nCategories, &nLevel, &nStatus)) return FALSE; SetSettings(pModule, nLevel, nStatus); for(UINT j = 0; j < nCategories; j++) { sprintf(szKey, "Category%d", j); ::GetPrivateProfileStringA(szSection, szKey, "", szValue, MAX_PATH, pszFileName); if(4 != sscanf(szValue, "Category:%u, Level:%u, Status:%u, Name:%s", &nCategory, &nLevel, &nStatus, szName)) return FALSE; UINT iCategory = pModule->m_nFirstCategory; while( iCategory != UINT( -1 ) ) { pCategory = g_Allocator.GetCategoryByIndex(iCategory); if( lstrcmpA(W2A(pCategory->Name()), szName) == 0 ) { SetSettings(pCategory, nLevel, nStatus); } iCategory = pCategory->m_nNext; } } } NotifyTool(); } } } return TRUE; } BOOL __stdcall AtlTraceSaveSettingsA(const CHAR *pszFileName) { CAtlAllocatorLock lock(&g_Allocator); if(!lock.Locked()) return FALSE; ATLASSERT(pszFileName); if(!pszFileName) return FALSE; BOOL bRetVal = FALSE; CHAR szKey[MAX_PATH], szValue[MAX_PATH]; UINT nCategories, nStatus; CAtlTraceProcess *pProcess; CAtlTraceModule *pModule; CAtlTraceCategory *pCategory; LPCSTR pszProcess = "Process"; pProcess = g_Allocator.GetProcess(); ATLASSERT(pProcess); if(!pProcess) return FALSE; bRetVal = TRUE; sprintf(szValue, "ModuleCount:%u, Level:%u, Enabled:%c, " "FuncAndCategoryNames:%c, FileNameAndLineNo:%c", pProcess->ModuleCount(), pProcess->m_nLevel, pProcess->m_bEnabled ? 't' : 'f', pProcess->m_bFuncAndCategoryNames ? 't' : 'f', pProcess->m_bFileNameAndLineNo ? 't' : 'f'); ::WritePrivateProfileStringA(pszProcess, "Info", szValue, pszFileName); // REVIEW: conversion in loop USES_CONVERSION; for(UINT i = 0; i < pProcess->ModuleCount(); i++) { pModule = g_Allocator.GetModule(i); ATLASSERT(pModule); if(!pModule) return FALSE; sprintf(szKey, "Module%d", i); ::WritePrivateProfileStringA(pszProcess, szKey, W2A(pModule->Name()), pszFileName); GetSettings(*pModule, &nStatus); nCategories = g_Allocator.GetCategoryCount(i); ::WritePrivateProfileStringA(W2A(pModule->Name()), "Name", W2A(pModule->Path()), pszFileName); sprintf(szValue, "CategoryCount:%u, Level:%u, Status:%u", nCategories, pModule->m_nLevel, nStatus); ::WritePrivateProfileStringA(W2A(pModule->Name()), "Settings", szValue, pszFileName); if(g_Allocator.IsValidCategoryIndex(pModule->m_nFirstCategory)) { int j = 0; UINT nCategory = pModule->m_nFirstCategory; while( nCategory != UINT( -1 ) ) { pCategory = g_Allocator.GetCategoryByIndex(nCategory); GetSettings(*pCategory, &nStatus); sprintf(szKey, "Category%d", j++); sprintf(szValue, "Category:%u, Level:%u, Status:%u, Name:%S", 0, pCategory->m_nLevel, nStatus, pCategory->Name()); ::WritePrivateProfileStringA(W2A(pModule->Name()), szKey, szValue, pszFileName); nCategory = pCategory->m_nNext; } } } return bRetVal; } BOOL __stdcall AtlTraceLoadSettingsU(const WCHAR *pszFileName, BOOL bForceLoad) { CAtlAllocatorLock lock(&g_Allocator); if(!lock.Locked()) return FALSE; WCHAR szFileName[MAX_PATH]; if(!pszFileName) { WCHAR szDrive[_MAX_DRIVE]; WCHAR szDir[_MAX_DIR]; WCHAR szFName[_MAX_FNAME]; WCHAR szExt[_MAX_EXT]; ::GetModuleFileNameW(NULL, szFileName, MAX_PATH); _wsplitpath(szFileName, szDrive, szDir, szFName, szExt); wcscpy(szExt, L".trc"); _wmakepath(szFileName, szDrive, szDir, szFName, szExt); pszFileName = szFileName; } if(pszFileName) { if(-1 != GetFileAttributesW(pszFileName)) { // file exists WCHAR szSection[MAX_PATH], szKey[MAX_PATH], szValue[MAX_PATH]; WCHAR szName[MAX_PATH]; UINT nModules, nCategories, nStatus, nLevel; UINT nModule, nCategory; CAtlTraceProcess *pProcess; CAtlTraceModule *pModule; CAtlTraceCategory *pCategory; LPCWSTR pszProcess = L"Process"; WCHAR cEnabled, cFuncAndCategoryNames, cFileNameAndLineInfo; pProcess = g_Allocator.GetProcess(); ATLASSERT(pProcess); if(!pProcess) return FALSE; if(!pProcess->m_bLoaded || bForceLoad) { pProcess->m_bLoaded = true; ::GetPrivateProfileStringW(pszProcess, L"Info", L"", szValue, MAX_PATH, pszFileName); if(5 != swscanf(szValue, L"ModuleCount:%u, Level:%u, Enabled:%c, " L"FuncAndCategoryNames:%c, FileNameAndLineNo:%c", &nModules, &pProcess->m_nLevel, &cEnabled, &cFuncAndCategoryNames, &cFileNameAndLineInfo)) { return FALSE; } pProcess->m_bEnabled = cEnabled != L'f'; pProcess->m_bFuncAndCategoryNames = cFuncAndCategoryNames != L'f'; pProcess->m_bFileNameAndLineNo = cFileNameAndLineInfo != L'f'; for(UINT i = 0; i < nModules; i++) { swprintf(szKey, L"Module%d", i); ::GetPrivateProfileStringW(pszProcess, szKey, L"", szSection, MAX_PATH, pszFileName); ::GetPrivateProfileStringW(szSection, L"Name", L"", szName, MAX_PATH, pszFileName); if(!g_Allocator.FindModule(szName, &nModule)) continue; pModule = g_Allocator.GetModule(nModule); ATLASSERT(pModule); if(!pModule) return FALSE; ::GetPrivateProfileStringW(szSection, L"Settings", L"", szValue, MAX_PATH, pszFileName); if(3 != swscanf(szValue, L"CategoryCount:%u, Level:%u, Status:%u", &nCategories, &nLevel, &nStatus)) return FALSE; SetSettings(pModule, nLevel, nStatus); for(UINT j = 0; j < nCategories; j++) { swprintf(szKey, L"Category%d", j); ::GetPrivateProfileStringW(szSection, szKey, L"", szValue, MAX_PATH, pszFileName); if(4 != swscanf(szValue, L"Category:%u, Level:%u, Status:%u, Name:%s", &nCategory, &nLevel, &nStatus, szName)) return FALSE; UINT iCategory = pModule->m_nFirstCategory; while( iCategory != UINT( -1 ) ) { pCategory = g_Allocator.GetCategoryByIndex(iCategory); if( lstrcmpW(pCategory->Name(), szName) == 0 ) { SetSettings(pCategory, nLevel, nStatus); } iCategory = pCategory->m_nNext; } } } NotifyTool(); } } } return TRUE; } BOOL __stdcall AtlTraceSaveSettingsU(const WCHAR *pszFileName) { CAtlAllocatorLock lock(&g_Allocator); if(!lock.Locked()) return FALSE; ATLASSERT(pszFileName); if(!pszFileName) return FALSE; BOOL bRetVal = FALSE; WCHAR szKey[MAX_PATH], szValue[MAX_PATH]; UINT nCategories, nStatus; CAtlTraceProcess *pProcess; CAtlTraceModule *pModule; CAtlTraceCategory *pCategory; LPCWSTR pszProcess = L"Process"; pProcess = g_Allocator.GetProcess(); ATLASSERT(pProcess); if(!pProcess) return FALSE; bRetVal = TRUE; swprintf(szValue, L"ModuleCount:%u, Level:%u, Enabled:%c, " L"FuncAndCategoryNames:%c, FileNameAndLineNo:%c", pProcess->ModuleCount(), pProcess->m_nLevel, pProcess->m_bEnabled ? L't' : L'f', pProcess->m_bFuncAndCategoryNames ? L't' : L'f', pProcess->m_bFileNameAndLineNo ? L't' : L'f'); ::WritePrivateProfileStringW(pszProcess, L"Info", szValue, pszFileName); for(UINT i = 0; i < pProcess->ModuleCount(); i++) { pModule = g_Allocator.GetModule(i); ATLASSERT(pModule); if(!pModule) return FALSE; swprintf(szKey, L"Module%d", i); ::WritePrivateProfileStringW(pszProcess, szKey, pModule->Name(), pszFileName); GetSettings(*pModule, &nStatus); nCategories = g_Allocator.GetCategoryCount(i); ::WritePrivateProfileStringW(pModule->Name(), L"Name", pModule->Path(), pszFileName); swprintf(szValue, L"CategoryCount:%u, Level:%u, Status:%u", nCategories, pModule->m_nLevel, nStatus); ::WritePrivateProfileStringW(pModule->Name(), L"Settings", szValue, pszFileName); if(g_Allocator.IsValidCategoryIndex(pModule->m_nFirstCategory)) { int j = 0; UINT nCategory = pModule->m_nFirstCategory; while( nCategory != UINT( -1 ) ) { pCategory = g_Allocator.GetCategoryByIndex(nCategory); GetSettings(*pCategory, &nStatus); swprintf(szKey, L"Category%d", j++); swprintf(szValue, L"Category:%u, Level:%u, Status:%u, Name:%s", 0, pCategory->m_nLevel, nStatus, pCategory->Name()); ::WritePrivateProfileStringW(pModule->Name(), szKey, szValue, pszFileName); nCategory = pCategory->m_nNext; } } } return bRetVal; } #endif }; // namespace ATL