197 lines
7.2 KiB
C++
197 lines
7.2 KiB
C++
// Quick XML
|
|
#ifndef _QXML_H
|
|
#define _QXML_H
|
|
|
|
class CQXMLEnum;
|
|
class CQXMLHelper;
|
|
|
|
class CQXML
|
|
{
|
|
public:
|
|
CQXML();
|
|
~CQXML();
|
|
|
|
HRESULT InitFromBuffer(LPCWSTR psz);
|
|
HRESULT InitEmptyDoc(LPCWSTR pszDocName, LPCWSTR pszNamespaceName, LPCWSTR pszNamespaceAlias);
|
|
|
|
HRESULT GetRootTagName(LPWSTR pszName, DWORD cchName);
|
|
HRESULT GetRootNamespaceName(LPWSTR pszNamespaceName, DWORD cchNamespaceName);
|
|
HRESULT GetRootNamespaceAlias(LPWSTR pszNamespaceAlias, DWORD cchNamespaceAlias);
|
|
|
|
HRESULT GetQXML(LPCWSTR pszPath, LPCWSTR pszName, CQXML** ppqxml);
|
|
HRESULT GetText(LPCWSTR pszPath, LPCWSTR pszName, LPWSTR pszText,
|
|
DWORD cchText);
|
|
HRESULT GetInt(LPCWSTR pszPath, LPCWSTR pszName, int* pi);
|
|
HRESULT GetFileTime(LPCWSTR pszPath, LPCWSTR pszName, FILETIME* pft);
|
|
HRESULT GetGUID(LPCWSTR pszPath, LPCWSTR pszName, GUID* pguid);
|
|
HRESULT GetVariant(LPCWSTR pszPath, LPCWSTR pszName, VARTYPE vt,
|
|
VARIANT* pvar);
|
|
static HRESULT FreeVariantMem(VARIANT* pvar);
|
|
|
|
HRESULT GetXMLTreeText(LPWSTR pszText, DWORD cchText);
|
|
|
|
HRESULT GetQXMLEnum(LPCWSTR pszPath, LPCWSTR pszName, CQXMLEnum** ppqxmlEnum);
|
|
|
|
HRESULT AppendQXML(LPCWSTR pszPath, LPCWSTR pszName, LPCWSTR pszTag,
|
|
LPCWSTR pszNamespaceName, LPCWSTR pszNamespaceAlias,
|
|
BOOL fUseExisting, CQXML** ppqxml);
|
|
HRESULT AppendTextNode(LPCWSTR pszPath, LPCWSTR pszName,
|
|
LPCWSTR pszNodeTag, LPCWSTR pszNamespaceName, LPCWSTR pszNamespaceAlias,
|
|
LPCWSTR pszNodeText, BOOL fUseExisting);
|
|
HRESULT AppendIntNode(LPCWSTR pszPath, LPCWSTR pszName, LPCWSTR pszNodeTag,
|
|
LPCWSTR pszNamespaceName, LPCWSTR pszNamespaceAlias,
|
|
int iNodeInt, BOOL fUseExisting);
|
|
HRESULT AppendInt32NodeEx(LPCWSTR pszPath, LPCWSTR pszName, LPCWSTR pszNodeTag,
|
|
LPCWSTR pszNamespaceName, LPCWSTR pszNamespaceAlias,
|
|
int iNodeInt, LPWSTR pszFormat, BOOL fUseExisting);
|
|
HRESULT AppendGUIDNode(LPCWSTR pszPath, LPCWSTR pszName, LPCWSTR pszNodeTag,
|
|
LPCWSTR pszNamespaceName, LPCWSTR pszNamespaceAlias,
|
|
GUID* pguid, BOOL fUseExisting);
|
|
HRESULT AppendFileTimeNode(LPCWSTR pszPath, LPCWSTR pszName, LPCWSTR pszNodeTag,
|
|
LPCWSTR pszNamespaceName, LPCWSTR pszNamespaceAlias,
|
|
FILETIME* pft, BOOL fUseExisting);
|
|
|
|
// No buffer version of the above Get fcts
|
|
HRESULT GetRootTagNameNoBuf(LPWSTR* ppszName);
|
|
HRESULT GetRootNamespaceNameNoBuf(LPWSTR* ppszNamespace);
|
|
HRESULT GetRootNamespaceAliasNoBuf(LPWSTR* ppszNamespaceAlias);
|
|
HRESULT GetTextNoBuf(LPCWSTR pszPath, LPCWSTR pszName, LPWSTR* ppszText);
|
|
HRESULT GetXMLTreeTextNoBuf(LPWSTR* ppszText);
|
|
static HRESULT ReleaseBuf(LPWSTR psz);
|
|
|
|
private:
|
|
HRESULT _ValidateParams(LPCWSTR pszNodeTag, LPCWSTR pszNamespaceName, LPCWSTR pszNamespaceAlias);
|
|
HRESULT _InitFromNode(IXMLDOMDocument* pxddoc, IXMLDOMNode* pxdnode);
|
|
HRESULT _GetNode(LPCWSTR pszPath, LPCWSTR pszName,
|
|
IXMLDOMNode** ppxdnode);
|
|
HRESULT _SetDocTagName(LPCWSTR pszName, LPCWSTR pszNamespaceName, LPCWSTR pszNamespaceAlias);
|
|
|
|
HRESULT _AppendText(IXMLDOMNode* pxdnode, LPCWSTR pszPath,
|
|
LPCWSTR pszName, LPCWSTR pszTag, LPCWSTR pszNamespaceName, LPCWSTR pszNamespaceAlias,
|
|
LPCWSTR pszText, BOOL fUseExisting);
|
|
HRESULT _AppendNode(IXMLDOMNode* pxdnode, LPCWSTR pszPath,
|
|
LPCWSTR pszName, LPCWSTR pszTag,
|
|
LPCWSTR pszNamespaceName, LPCWSTR pszNamespaceAlias,
|
|
BOOL fUseExisting, IXMLDOMNode** ppxdnodeNew);
|
|
HRESULT _GetSafeSubNode(IXMLDOMNode* pxdnode, LPCWSTR pszNode,
|
|
LPCWSTR pszNamespaceName, LPCWSTR pszNamespaceAlias,
|
|
IXMLDOMNode** ppxdnodeSub, BOOL fUseExisting);
|
|
HRESULT _GetNodeRecursePath(IXMLDOMNode* pxdnode, LPCWSTR pszPath,
|
|
LPCWSTR pszNamespaceName, LPCWSTR pszNamespaceAlias,
|
|
IXMLDOMNode** ppxdnodeSub, BOOL fUseExisting);
|
|
HRESULT _GetSafeNode(IXMLDOMNode* pxdnode, LPCWSTR pszPath,
|
|
LPCWSTR pszName, LPCWSTR pszNamespaceName, LPCWSTR pszNamespaceAlias,
|
|
IXMLDOMNode** ppxdnodeSub, BOOL fUseExisting);
|
|
|
|
friend class CQXMLEnum;
|
|
|
|
protected:
|
|
IXMLDOMDocument* _pxddoc;
|
|
IXMLDOMNode* _pxdnode;
|
|
BOOL _fIsRoot;
|
|
|
|
#ifdef DEBUG
|
|
public:
|
|
static void _DbgAssertNoLeak();
|
|
|
|
static DWORD d_cBSTRReturned;
|
|
static DWORD d_cInstances;
|
|
static DWORD d_cInstancesEnum;
|
|
BOOL d_fInited;
|
|
static DWORD d_cxddocRef;
|
|
static DWORD d_cxdnodeRef;
|
|
|
|
private:
|
|
BOOL _DbgIsInited();
|
|
void _DbgAssertValidState();
|
|
#endif
|
|
};
|
|
|
|
class CQXMLEnum
|
|
{
|
|
public:
|
|
~CQXMLEnum();
|
|
|
|
HRESULT NextQXML(CQXML** ppqxml);
|
|
|
|
HRESULT NextGUID(GUID* pguid);
|
|
HRESULT NextFileTime(FILETIME* pft);
|
|
HRESULT NextText(LPWSTR pszText, DWORD cchText);
|
|
HRESULT NextInt(int* pi);
|
|
HRESULT NextVariant(VARTYPE vt, VARIANT* pvar);
|
|
|
|
HRESULT GetCount(long* pl);
|
|
|
|
// No buffer
|
|
HRESULT NextTextNoBuf(LPWSTR* ppszText);
|
|
|
|
private:
|
|
// Should be called from CQXML only
|
|
CQXMLEnum();
|
|
|
|
HRESULT _Init(IXMLDOMNode* pxdnode, LPCWSTR pszPath, LPCWSTR pszName);
|
|
HRESULT _InitDoc(IXMLDOMDocument* pxddoc);
|
|
|
|
friend class CQXML;
|
|
|
|
private:
|
|
HRESULT _NextGeneric(IXMLDOMNode** ppxdnode);
|
|
|
|
private:
|
|
IXMLDOMNodeList* _pxdnodelist;
|
|
IXMLDOMNode* _pxdnode;
|
|
IXMLDOMDocument* _pxddoc;
|
|
|
|
BSTR _bstrPath;
|
|
|
|
#ifdef DEBUG
|
|
public:
|
|
static DWORD d_cxdnodelistRef;
|
|
#endif
|
|
};
|
|
|
|
class CQXMLHelper
|
|
{
|
|
public:
|
|
static HRESULT GetTextFromNode(IXMLDOMNode* pxdnode,
|
|
LPWSTR pszText, DWORD cchText);
|
|
static HRESULT GetTagTextFromNode(IXMLDOMNode* pxdnode,
|
|
LPWSTR pszText, DWORD cchText);
|
|
static HRESULT GetNamespaceNameFromNode(IXMLDOMNode* pxdnode,
|
|
LPWSTR pszText, DWORD cchText);
|
|
static HRESULT GetNamespaceAliasFromNode(IXMLDOMNode* pxdnode,
|
|
LPWSTR pszText, DWORD cchText);
|
|
|
|
static HRESULT GetIntFromNode(IXMLDOMNode* pxdnode, int* pi);
|
|
static HRESULT GetGUIDFromNode(IXMLDOMNode* pxdnode,
|
|
GUID* pguid);
|
|
static HRESULT GetFileTimeFromNode(IXMLDOMNode* pxdnode,
|
|
FILETIME* pft);
|
|
|
|
static HRESULT GetXMLTreeTextFromNode(IXMLDOMNode* pxdnode,
|
|
LPWSTR pszText, DWORD cchText);
|
|
static HRESULT GetVariantFromNode(IXMLDOMNode* pxdnode, VARTYPE vt,
|
|
VARIANT* pvar);
|
|
|
|
static HRESULT GetConcatenatedBSTR(LPCWSTR pszStr1, LPCWSTR pszStr2,
|
|
BSTR* pbstr);
|
|
|
|
static HRESULT CreateAndInsertNode(IXMLDOMDocument* pxddoc,
|
|
IXMLDOMNode* pxdnodeParent, LPCWSTR pszStr,
|
|
LPCWSTR pszNamespaceName, LPCWSTR pszNamespaceAlias,
|
|
DOMNodeType nodetype, IXMLDOMNode** ppxdnodeNew);
|
|
|
|
// No buffer
|
|
static HRESULT GetTextFromNodeNoBuf(IXMLDOMNode* pxdnode,
|
|
LPWSTR* ppszText);
|
|
static HRESULT GetTagTextFromNodeNoBuf(IXMLDOMNode* pxdnode,
|
|
LPWSTR* ppszText);
|
|
static HRESULT GetNamespaceNameFromNodeNoBuf(IXMLDOMNode* pxdnode,
|
|
LPWSTR* ppszText);
|
|
static HRESULT GetNamespaceAliasFromNodeNoBuf(IXMLDOMNode* pxdnode,
|
|
LPWSTR* ppszText);
|
|
static HRESULT GetXMLTreeTextFromNodeNoBuf(IXMLDOMNode* pxdnode,
|
|
LPWSTR* ppszText);
|
|
};
|
|
|
|
#endif //_QXML_H
|