in src/InstrumentationEngine/ProfilerManager.cpp [471:614]
DWORD WINAPI CProfilerManager::ParseAttachConfigurationThreadProc(
_In_ LPVOID lpParameter
)
{
HRESULT hr = S_OK;
#ifndef PLATFORM_UNIX
hr = CoInitialize(NULL);
if (FAILED(hr))
{
CLogging::LogError(_T("CConfigurationLocator::ParseAttachConfigurationThreadProc - CoInitializeEx failed"));
return 1;
}
#endif
CProfilerManager* pProfilerManager = static_cast<CProfilerManager*>(lpParameter);
if (pProfilerManager == NULL)
{
CLogging::LogError(_T("CConfigurationLocator::ParseAttachConfigurationThreadProc - Invalid parameter"));
return 1;
}
CComPtr<CXmlDocWrapper> pDocument;
pDocument.Attach(new CXmlDocWrapper());
IfFailRet(pDocument->LoadContent(pProfilerManager->m_tstrConfigXml.c_str()));
CComPtr<CXmlNode> pDocumentNode;
IfFailRet(pDocument->GetRootNode(&pDocumentNode));
CComPtr<CXmlNode> pCurrChildNode;
IfFailRet(pDocumentNode->GetChildNode(&pCurrChildNode));
tstring currChildNodeName;
IfFailRet(pDocumentNode->GetName(currChildNodeName));
if (wcscmp(currChildNodeName.c_str(), _T("InstrumentationEngineConfiguration")) != 0)
{
CLogging::LogError(_T("CConfigurationLocator::ParseAttachConfigurationThreadProc - Invalid configuration. Root element should be InstrumentationEngineConfiguration"));
return E_FAIL;
}
while (pCurrChildNode != nullptr)
{
IfFailRet(pCurrChildNode->GetName(currChildNodeName));
if (wcscmp(currChildNodeName.c_str(), _T("InstrumentationEngine")) == 0)
{
CComPtr<CXmlNode> pSettingsNode;
IfFailRet(pCurrChildNode->GetChildNode(&pSettingsNode));
if (pSettingsNode != nullptr)
{
tstring settingsNodeName;
IfFailRet(pSettingsNode->GetName(settingsNodeName));
if (wcscmp(settingsNodeName.c_str(), _T("Settings")) == 0)
{
unordered_map<tstring, tstring> settingsMap;
IfFailRet(ParseSettingsConfigurationNode(pSettingsNode, settingsMap));
for (unordered_map<tstring, tstring>::iterator it = settingsMap.begin();
it != settingsMap.end();
++it)
{
if (wcscmp(it->first.c_str(), _T("LogLevel")) == 0)
{
CLogging::SetLoggingFlags(CLoggerService::ExtractLoggingFlags(it->second.c_str()));
}
else if (wcscmp(it->first.c_str(), _T("LogFileLevel")) == 0)
{
CLogging::SetLogFileLevel(CLoggerService::ExtractLoggingFlags(it->second.c_str()));
}
else if (wcscmp(it->first.c_str(), _T("LogFilePath")) == 0)
{
CLogging::SetLogFilePath(it->second.c_str());
}
}
}
}
}
else if (wcscmp(currChildNodeName.c_str(), _T("InstrumentationMethods")) == 0)
{
CComPtr<CXmlNode> pInstrumentationMethodNode;
IfFailRet(pCurrChildNode->GetChildNode(&pInstrumentationMethodNode));
while (pInstrumentationMethodNode != nullptr)
{
tstring instrumentationMethodNodeName;
IfFailRet(pInstrumentationMethodNode->GetName(instrumentationMethodNodeName));
if (wcscmp(instrumentationMethodNodeName.c_str(), _T("AddInstrumentationMethod")) == 0)
{
tstring configPath;
IfFailRet(pInstrumentationMethodNode->GetAttribute(_T("ConfigPath"), configPath));
IfFalseRet(configPath.length() != 0, E_FAIL);
CComPtr<CConfigurationSource> pSource;
pSource.Attach(new (nothrow) CConfigurationSource(configPath.c_str()));
IfFalseRet(nullptr != pSource, E_OUTOFMEMORY);
CComPtr<CXmlNode> pInstrumentationMethodChildNode;
IfFailRet(pInstrumentationMethodNode->GetChildNode(&pInstrumentationMethodChildNode));
while (pInstrumentationMethodChildNode != nullptr)
{
tstring instrumentationMethodChildNodeName;
IfFailRet(pInstrumentationMethodChildNode->GetName(instrumentationMethodChildNodeName));
if (wcscmp(instrumentationMethodChildNodeName.c_str(), _T("Settings")) == 0)
{
unordered_map<tstring, tstring> settingsMap;
IfFailRet(ParseSettingsConfigurationNode(pInstrumentationMethodChildNode, settingsMap));
for (unordered_map<tstring, tstring>::iterator it = settingsMap.begin();
it != settingsMap.end();
++it)
{
IfFailRet(pSource->AddSetting(it->first.c_str(), it->second.c_str()));
}
}
CXmlNode* nextInstrumentationMethod = pInstrumentationMethodChildNode->Next();
pInstrumentationMethodChildNode.Release();
pInstrumentationMethodChildNode.Attach(nextInstrumentationMethod);
}
pProfilerManager->m_configSources.push_back(pSource.p);
}
CXmlNode* next = pInstrumentationMethodNode->Next();
pInstrumentationMethodNode.Release();
pInstrumentationMethodNode.Attach(next);
}
}
CXmlNode* next = pCurrChildNode->Next();
pCurrChildNode.Release();
pCurrChildNode.Attach(next);
}
#ifndef PLATFORM_UNIX
CoUninitialize();
#endif
return 0;
}