133 lines
3.5 KiB
C++
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 |