in Exdi/exdigdbsrv/GdbSrvControllerLib/cfgExdiGdbSrvHelper.cpp [523:603]
HRESULT ConfigExdiGdbServerHelperImpl::ReadStream()
{
HRESULT hr = E_FAIL;
bool isForcedEnd = false;
while (!m_XmlLiteReader->IsEOF() && !isForcedEnd)
{
XmlNodeType nodeType;
hr = m_XmlLiteReader->Read(&nodeType);
if (FAILED(hr) || (hr == S_FALSE))
{
break;
}
switch(nodeType)
{
case XmlNodeType_XmlDeclaration:
case XmlNodeType_ProcessingInstruction:
case XmlNodeType_Comment:
case XmlNodeType_DocumentType:
break;
case XmlNodeType_Text:
{
if (GetPrevProcessTagElementStatus())
{
PCWSTR pAttribValue = nullptr;
hr = m_XmlLiteReader->GetValue(&pAttribValue, nullptr);
if (SUCCEEDED(hr))
{
XmlDataGdbServerRegisterFile::SetFileTargetArchitecture(pAttribValue, &m_ExdiGdbServerData);
SetPrevProcessTagElementDone();
}
}
}
break;
case XmlNodeType_Element:
{
PCWSTR pTagName = nullptr;
hr = m_XmlLiteReader->GetLocalName(&pTagName, nullptr);
if (SUCCEEDED(hr) && (pTagName != nullptr))
{
TAG_ATTR_LIST tagAttrList = {};
InitializeListHead(&tagAttrList.attrPair);
size_t copyLength = wcslen(pTagName) + 1;
unique_ptr<WCHAR> pTagNameCopy(new (nothrow) WCHAR[copyLength]);
if (pTagNameCopy != nullptr)
{
ZeroMemory(pTagNameCopy.get(), sizeof(WCHAR) * (copyLength));
wcscpy_s(pTagNameCopy.get(), copyLength, pTagName);
tagAttrList.tagName = pTagNameCopy.get();
// Parse the XML tag
hr = ParseAttributes(&tagAttrList);
if (SUCCEEDED(hr))
{
hr = ProcessAttributeList(&tagAttrList);
if (FAILED(hr))
{
isForcedEnd = true;
break;
}
}
else
{
// Try removing any added element to the list
ClearTagAttributesList(&tagAttrList);
isForcedEnd = true;
}
}
else
{
isForcedEnd = true;
hr = E_OUTOFMEMORY;
}
}
}
break;
}
}
return hr;
}