HRESULT ConfigExdiGdbServerHelperImpl::ReadStream()

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