DWORD WINAPI CProfilerManager::ParseAttachConfigurationThreadProc()

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