2025-04-27 07:49:33 -04:00

280 lines
5.6 KiB
C++

#include <objbase.h>
#include "qxml.h"
//#include "dbgassrt.h"
#include <assert.h>
// BUGBUG: deal with this
#define ASSERT(a) (assert(a))
#define INCDEBUGCOUNTER(a)
#define DECDEBUGCOUNTER(a)
// BUGBUG: deal with this
//DEBUG_ONLY(DWORD CQXMLEnum::d_cxdnodelistRef = 0);
CQXMLEnum::CQXMLEnum() : _pxdnodelist(NULL), _pxddoc(NULL), _pxdnode(NULL)
{
INCDEBUGCOUNTER(CQXML::d_cInstancesEnum);
}
CQXMLEnum::~CQXMLEnum()
{
if (_bstrPath)
{
SysFreeString(_bstrPath);
}
if (_pxdnode)
{
_pxdnode->Release();
DECDEBUGCOUNTER(CQXML::d_cxdnodeRef);
}
if (_pxdnodelist)
{
_pxdnodelist->Release();
DECDEBUGCOUNTER(d_cxdnodelistRef);
}
if (_pxddoc)
{
_pxddoc->Release();
DECDEBUGCOUNTER(CQXML::d_cxddocRef);
}
DECDEBUGCOUNTER(CQXML::d_cInstancesEnum);
}
HRESULT CQXMLEnum::_Init(IXMLDOMNode* pxdnode, LPCWSTR pszPath, LPCWSTR pszName)
{
HRESULT hres = CQXMLHelper::GetConcatenatedBSTR(pszPath, pszName, &_bstrPath);
if (SUCCEEDED(hres))
{
pxdnode->AddRef();
INCDEBUGCOUNTER(CQXML::d_cxdnodeRef);
_pxdnode = pxdnode;
}
return hres;
}
// Only required when enumerating QXML
HRESULT CQXMLEnum::_InitDoc(IXMLDOMDocument* pxddoc)
{
pxddoc->AddRef();
INCDEBUGCOUNTER(CQXML::d_cxddocRef);
_pxddoc = pxddoc;
return S_OK;
}
HRESULT CQXMLEnum::GetCount(long* pl)
{
HRESULT hres = S_OK;
*pl = 0;
if (!_pxdnodelist)
{
hres = _pxdnode->selectNodes(_bstrPath, &_pxdnodelist);
}
if (SUCCEEDED(hres) && (S_FALSE != hres))
{
INCDEBUGCOUNTER(d_cxdnodelistRef);
hres = _pxdnodelist->get_length(pl);
}
return hres;
}
HRESULT CQXMLEnum::NextQXML(CQXML** ppqxml)
{
ASSERT(_pxddoc);
IXMLDOMNode* pxdnodeSub;
HRESULT hres = _NextGeneric(&pxdnodeSub);
if (SUCCEEDED(hres) && (S_FALSE != hres))
{
ASSERT(pxdnodeSub);
*ppqxml = new CQXML();
if (*ppqxml)
{
hres = (*ppqxml)->_InitFromNode(_pxddoc, pxdnodeSub);
if (FAILED(hres))
{
delete *ppqxml;
*ppqxml = NULL;
}
}
else
{
hres = E_OUTOFMEMORY;
}
pxdnodeSub->Release();
DECDEBUGCOUNTER(CQXML::d_cxdnodeRef);
}
return hres;
}
HRESULT CQXMLEnum::NextText(LPWSTR pszText, DWORD cchText)
{
IXMLDOMNode* pxdnodeSub;
HRESULT hres = _NextGeneric(&pxdnodeSub);
if (SUCCEEDED(hres) && (S_FALSE != hres))
{
ASSERT(pxdnodeSub);
hres = CQXMLHelper::GetTextFromNode(pxdnodeSub, pszText, cchText);
pxdnodeSub->Release();
DECDEBUGCOUNTER(CQXML::d_cxdnodeRef);
}
return hres;
}
HRESULT CQXMLEnum::NextInt(int* pi)
{
IXMLDOMNode* pxdnodeSub;
HRESULT hres = _NextGeneric(&pxdnodeSub);
if (SUCCEEDED(hres) && (S_FALSE != hres))
{
ASSERT(pxdnodeSub);
hres = CQXMLHelper::GetIntFromNode(pxdnodeSub, pi);
pxdnodeSub->Release();
DECDEBUGCOUNTER(CQXML::d_cxdnodeRef);
}
return hres;
}
HRESULT CQXMLEnum::NextGUID(GUID* pguid)
{
IXMLDOMNode* pxdnodeSub;
HRESULT hres = _NextGeneric(&pxdnodeSub);
if (SUCCEEDED(hres) && (S_FALSE != hres))
{
ASSERT(pxdnodeSub);
hres = CQXMLHelper::GetGUIDFromNode(pxdnodeSub, pguid);
pxdnodeSub->Release();
DECDEBUGCOUNTER(CQXML::d_cxdnodeRef);
}
return hres;
}
HRESULT CQXMLEnum::NextFileTime(FILETIME* pft)
{
IXMLDOMNode* pxdnodeSub;
HRESULT hres = _NextGeneric(&pxdnodeSub);
if (SUCCEEDED(hres) && (S_FALSE != hres))
{
ASSERT(pxdnodeSub);
hres = CQXMLHelper::GetFileTimeFromNode(pxdnodeSub, pft);
pxdnodeSub->Release();
DECDEBUGCOUNTER(CQXML::d_cxdnodeRef);
}
return hres;
}
HRESULT CQXMLEnum::NextVariant(VARTYPE vt, VARIANT* pvar)
{
IXMLDOMNode* pxdnodeSub;
HRESULT hres = _NextGeneric(&pxdnodeSub);
if (SUCCEEDED(hres) && (S_FALSE != hres))
{
ASSERT(pxdnodeSub);
hres = CQXMLHelper::GetVariantFromNode(pxdnodeSub, vt, pvar);
pxdnodeSub->Release();
DECDEBUGCOUNTER(CQXML::d_cxdnodeRef);
}
return hres;
}
HRESULT CQXMLEnum::_NextGeneric(IXMLDOMNode** ppxdnode)
{
HRESULT hres = S_OK;
*ppxdnode = NULL;
if (!_pxdnodelist)
{
hres = _pxdnode->selectNodes(_bstrPath, &_pxdnodelist);
if (SUCCEEDED(hres))
{
INCDEBUGCOUNTER(d_cxdnodelistRef);
}
}
if (SUCCEEDED(hres) && (S_FALSE != hres))
{
IXMLDOMNode* pxdnodeSub;
hres = _pxdnodelist->nextNode(&pxdnodeSub);
if (SUCCEEDED(hres) && (S_FALSE != hres))
{
ASSERT(pxdnodeSub);
INCDEBUGCOUNTER(CQXML::d_cxdnodeRef);
*ppxdnode = pxdnodeSub;
}
}
else
{
_pxdnodelist = NULL;
}
return hres;
}
HRESULT CQXMLEnum::NextTextNoBuf(LPWSTR* ppszText)
{
IXMLDOMNode* pxdnodeSub;
HRESULT hres = _NextGeneric(&pxdnodeSub);
if (SUCCEEDED(hres) && (S_FALSE != hres))
{
ASSERT(pxdnodeSub);
hres = CQXMLHelper::GetTextFromNodeNoBuf(pxdnodeSub, ppszText);
pxdnodeSub->Release();
DECDEBUGCOUNTER(CQXML::d_cxdnodeRef);
}
return hres;
}