windows-nt/Source/XPSP1/NT/admin/pchealth/client/include/pfxml.h
2020-09-26 16:20:57 +08:00

133 lines
3.5 KiB
C++

/********************************************************************
Copyright (c) 2000 Microsoft Corporation
Module Name:
pfxml.h
Abstract:
A simple XML parser & object model (for read only access to an XML
file. This is heavily (nearly stolen) based on WSmith's SimpleXML
stuff that he wrote for the Neptune comments button
Revision History:
DerekM created 03/15/00
********************************************************************/
#ifndef PFXML_H
#define PFXML_H
#include "util.h"
#include "pfarray.h"
#include "pfhash.h"
class CPFXMLParser;
class CPFXMLNode;
/////////////////////////////////////////////////////////////////////////////
// enumerations
enum EPFXMLNodeType
{
xmlntUnknown = 0,
xmlntElement,
xmlntText,
};
/////////////////////////////////////////////////////////////////////////////
// CPFXMLDocument
class CPFXMLDocument : public CPFPrivHeapGenericClassBase
{
private:
// member data
CPFXMLNode *m_ppfxmlRoot;
public:
CPFXMLDocument(void);
~CPFXMLDocument(void);
HRESULT get_RootNode(CPFXMLNode **pppfxmlRoot);
HRESULT put_RootNode(CPFXMLNode *ppfxmlRoot);
HRESULT ParseFile(LPWSTR wszFile);
HRESULT ParseBlob(BYTE *pbBlob, DWORD cbBlob);
HRESULT ParseStream(IStream *pStm, DWORD cbStm);
HRESULT WriteFile(LPWSTR wszFile);
};
/////////////////////////////////////////////////////////////////////////////
// CPFArrayAttr definition
class CPFArrayAttr : public CPFArrayBase
{
private:
void DeleteItem(LPVOID pv);
LPVOID AllocItemCopy(LPVOID pv);
public:
HRESULT CopyFrom(CPFArrayAttr *prg)
{
return internalCopyFrom(prg);
}
};
/////////////////////////////////////////////////////////////////////////////
// CPFXMLDocument
class CPFXMLNode : private CPFPrivHeapGenericClassBase, public IUnknown
{
friend class CPFXMLDocument;
private:
// memberdata
CPFArrayUnknown m_rgChildren;
EPFXMLNodeType m_xmlnt;
CPFArrayAttr m_rgAttr;
CComBSTR m_bstrTagData;
DWORD m_cRef;
// member functions
CPFXMLNode(DWORD cRef);
~CPFXMLNode(void);
HRESULT Write(HANDLE hFile);
void Cleanup(void);
public:
static CPFXMLNode *CreateInstance(void);
STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppv) { return E_NOTIMPL; }
STDMETHOD_(ULONG, AddRef)(void);
STDMETHOD_(ULONG, Release)(void);
EPFXMLNodeType get_NodeType(void) { return m_xmlnt; }
void put_NodeType(EPFXMLNodeType xmlnt) { m_xmlnt = xmlnt; }
HRESULT get_Data(BSTR *pbstrData);
HRESULT put_Data(LPCWSTR wszData, DWORD cch = (DWORD)-1);
HRESULT append_Data(LPCWSTR wszData, DWORD cch = (DWORD)-1);
DWORD get_AttributeCount(void) { return m_rgAttr.get_Highest() + 1; }
HRESULT add_Attribute(LPCWSTR wszName, LPCWSTR wszVal,
DWORD cchName = (DWORD)-1, DWORD cchVal = (DWORD)-1);
HRESULT get_Attribute(LPCWSTR wszName, BSTR *pbstrVal);
HRESULT get_Attribute(DWORD iAttr, BSTR *pbstrVal);
DWORD get_ChildCount(void) { return m_rgChildren.get_Highest() + 1; }
HRESULT DeleteAllChildren(void);
HRESULT append_Child(CPFXMLNode *ppfxml);
HRESULT append_Children(CPFArrayUnknown &rgNodes);
HRESULT get_Child(DWORD iChild, CPFXMLNode **pppfxml);
HRESULT get_MatchingChildElements(LPCWSTR wszTag, CPFArrayUnknown &rgNodes);
HRESULT get_ChildText(BSTR *pbstrText);
HRESULT CloneNode(CPFXMLNode **pppfxml, BOOL fWantChildren = TRUE);
};
#endif