421 lines
12 KiB
C++
421 lines
12 KiB
C++
// 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
|