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.
 
 
 
 
 
 

421 lines
12 KiB

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