You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.0 KiB
114 lines
3.0 KiB
/*++
|
|
|
|
Copyright (c) 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 "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
|