windows-nt/Source/XPSP1/NT/base/win32/fusion/sxs/sxsxmltree.h

115 lines
2.9 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
sxsxmltree.h
Abstract:
Create a XML DOM tree during push-mode parsing
Author:
Xiaoyu Wu (xiaoyuw) Aug 2000
Revision History:
--*/
#if !defined(_FUSION_SXS_XMLTREE_H_INCLUDED_)
#define _FUSION_SXS_XMLTREE_H_INCLUDED_
#pragma once
#include "stdinc.h"
#include "xmlparser.h"
#include "FusionHeap.h"
// allocatememory for this element, and all its attributes once
struct _SXS_XMLATTRIBUTE{
PWSTR m_wszName;
ULONG m_ulPrefixLen;
PWSTR m_wszValue;
};
typedef struct _SXS_XMLATTRIBUTE SXS_XMLATTRIBUTE;
class SXS_XMLTreeNode{
public:
friend VOID PrintTreeFromRoot(SXS_XMLTreeNode * Root);
friend class SXS_XMLDOMTree;
SXS_XMLTreeNode() :
m_AttributeList(NULL),
m_cAttributes(0),
m_pwszStr(NULL),
m_ulPrefixLen(0),
m_pSiblingNode(NULL),
m_pParentNode(NULL),
m_pFirstChild(NULL),
m_pMemoryPool(NULL) { }
VOID DeleteSelf() { FUSION_DELETE_SINGLETON(this); }
~SXS_XMLTreeNode() {
CSxsPreserveLastError ple;
if (m_pMemoryPool != NULL)
{
FUSION_DELETE_ARRAY(m_pMemoryPool);
m_pMemoryPool = NULL;
}
ple.Restore();
}
HRESULT CreateTreeNode(USHORT cNumRecs, XML_NODE_INFO** apNodeInfo);
VOID PrintSelf();
private:
HRESULT ComputeBlockSize(USHORT cNumRecs, XML_NODE_INFO** apNodeInfo, DWORD * dwBlockSizeInBytes);
// for each node, allocate memory once : compute the total spaces need for prefix, localname, and value,
ULONG m_ulPrefixLen;
PWSTR m_pwszStr; // Can be a name for ELEMENT, a value for a PCDATA
SXS_XMLATTRIBUTE *m_AttributeList;
USHORT m_cAttributes;
SXS_XMLTreeNode *m_pSiblingNode;
SXS_XMLTreeNode *m_pParentNode;
SXS_XMLTreeNode *m_pFirstChild;
BYTE *m_pMemoryPool; // memory for attribs array, name-value pairs and name-value for the node
};
class SXS_XMLDOMTree{
public:
HRESULT AddNode(USHORT cNumRecs, XML_NODE_INFO** apNodeInfo); // CreateNode calls this func to add node into the Tree,
VOID ReturnToParent(); // EndChildren calls this func if "fEmpty=FALSE"
VOID SetChildCreation(); // BeginChildren calls this func
/*
VOID TurnOffFirstChildFlag();
*/
SXS_XMLDOMTree():
m_fBeginChildCreation(FALSE),
m_Root(NULL),
m_pCurrentNode(NULL)
{ }
VOID DeleteTreeBranch(SXS_XMLTreeNode * pNode);
~SXS_XMLDOMTree(){
CSxsPreserveLastError ple;
this->DeleteTreeBranch(m_Root); // do not delete its siblings
ple.Restore();
}
VOID PrintTreeFromRoot(SXS_XMLTreeNode * Root);
SXS_XMLTreeNode * GetRoot() {
return m_Root;
}
private :
BOOL m_fBeginChildCreation; // everytime, when BeginChild is called, it is set, once it is checked, set it to be FALSE
SXS_XMLTreeNode * m_Root;
SXS_XMLTreeNode * m_pCurrentNode;
};
#endif