236 lines
5 KiB
C++
236 lines
5 KiB
C++
//----------------------------------------------------------------------------
|
||
//
|
||
// Microsoft Windows
|
||
// Copyright (C) Microsoft Corporation, 1996
|
||
//
|
||
// File: csenum.cxx
|
||
//
|
||
// Contents: Per Class Container Package Enumeration
|
||
//
|
||
//
|
||
// History: 09-09-96 DebiM created
|
||
// 11-01-97 DebiM modified, moved to cstore
|
||
//
|
||
//----------------------------------------------------------------------------
|
||
|
||
#include "dsbase.hxx"
|
||
#include "csenum.hxx"
|
||
|
||
|
||
|
||
|
||
//IEnumPackage implementation.
|
||
|
||
HRESULT CEnumPackage::QueryInterface(REFIID riid, void** ppObject)
|
||
{
|
||
if (riid==IID_IUnknown || riid==IID_IEnumPackage)
|
||
{
|
||
*ppObject=(IEnumPackage *) this;
|
||
}
|
||
else
|
||
{
|
||
return E_NOINTERFACE;
|
||
}
|
||
AddRef();
|
||
return S_OK;
|
||
}
|
||
|
||
ULONG CEnumPackage::AddRef()
|
||
{
|
||
InterlockedIncrement((long*) &m_dwRefCount);
|
||
return m_dwRefCount;
|
||
}
|
||
|
||
ULONG CEnumPackage::Release()
|
||
{
|
||
ULONG dwRefCount=m_dwRefCount-1;
|
||
if (InterlockedDecrement((long*) &m_dwRefCount)==0)
|
||
{
|
||
delete this;
|
||
return 0;
|
||
}
|
||
return dwRefCount;
|
||
}
|
||
|
||
// IEnumPackage methods
|
||
//extern DBBINDING InstallBinding [];
|
||
|
||
//
|
||
// CEnumPackage::Next
|
||
// ------------------
|
||
//
|
||
//
|
||
//
|
||
// Synopsis: This method returns the next celt number of packages
|
||
// within the scope of the enumeration.
|
||
// Packages are returned in the alphabetical name order.
|
||
//
|
||
// Arguments: [in] celt - Number of package details to fetch
|
||
// INSTALLINFO *rgelt - Package detail structure
|
||
// ULONG *pceltFetched - Number of packages returned
|
||
//
|
||
// Returns: S_OK or S_FALSE if short of packages
|
||
//
|
||
//
|
||
//
|
||
|
||
HRESULT CEnumPackage::Next(ULONG celt,
|
||
PACKAGEDISPINFO *rgelt,
|
||
ULONG *pceltFetched)
|
||
|
||
{
|
||
ULONG cgot = 0;
|
||
HRESULT hr = S_OK;
|
||
Data *pData;
|
||
LPOLESTR name;
|
||
|
||
if ((celt > 1) && (!pceltFetched))
|
||
return E_INVALIDARG;
|
||
|
||
if (pceltFetched)
|
||
(*pceltFetched) = 0;
|
||
|
||
if (!IsValidPtrOut(rgelt, sizeof(PACKAGEDISPINFO)*celt))
|
||
return E_INVALIDARG;
|
||
|
||
hr = FetchPackageInfo(m_pIRow,
|
||
m_HAcc,
|
||
m_dwAppFlags,
|
||
m_pdwLocale,
|
||
m_pPlatform,
|
||
celt,
|
||
&cgot,
|
||
rgelt);
|
||
|
||
|
||
//
|
||
// BUGBUG. Check for errors.
|
||
//
|
||
if (cgot != celt)
|
||
hr = S_FALSE;
|
||
else
|
||
hr = S_OK;
|
||
|
||
m_dwPosition += cgot;
|
||
|
||
if (pceltFetched)
|
||
*pceltFetched = cgot;
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
HRESULT CEnumPackage::Skip(ULONG celt)
|
||
{
|
||
ULONG celtFetched = NULL, i;
|
||
HRESULT hr = S_OK;
|
||
PACKAGEDISPINFO *pIf = NULL;
|
||
|
||
pIf = new PACKAGEDISPINFO[celt];
|
||
hr = Next(celt, pIf, &celtFetched);
|
||
for (i = 0; i < celtFetched; i++)
|
||
ReleasePackageInfo(pIf+i);
|
||
delete pIf;
|
||
|
||
return hr;
|
||
}
|
||
|
||
HRESULT CEnumPackage::Reset()
|
||
{
|
||
m_dwPosition = 0;
|
||
return m_pIRow->RestartPosition(NULL);
|
||
}
|
||
|
||
// BUGBUG:: Positioning
|
||
|
||
HRESULT CEnumPackage::Clone(IEnumPackage **ppenum)
|
||
{
|
||
CEnumPackage *pClone = new CEnumPackage;
|
||
HRESULT hr = S_OK, hr1 = S_OK;
|
||
|
||
hr = pClone->Initialize(m_CommandText, m_dwAppFlags, m_pdwLocale, m_pPlatform);
|
||
if (FAILED(hr)) {
|
||
delete pClone;
|
||
return hr;
|
||
}
|
||
|
||
hr = pClone->QueryInterface(IID_IEnumPackage, (void **)ppenum);
|
||
|
||
if (m_dwPosition)
|
||
hr1 = pClone->Skip(m_dwPosition);
|
||
// we do not want to return the error code frm skip.
|
||
return hr;
|
||
}
|
||
|
||
CEnumPackage::CEnumPackage()
|
||
{
|
||
m_dwRefCount = 0;
|
||
m_HAcc = NULL;
|
||
m_pIRow = NULL;
|
||
m_pIAccessor = NULL;
|
||
m_CommandText = NULL;
|
||
m_dwPosition = 0;
|
||
m_pIDBCreateCommand = NULL;
|
||
m_pdwLocale = NULL;
|
||
m_pPlatform = NULL;
|
||
StartQuery(&(m_pIDBCreateCommand));
|
||
}
|
||
|
||
|
||
|
||
HRESULT CEnumPackage::Initialize(LPOLESTR szCommandText,
|
||
DWORD dwAppFlags,
|
||
DWORD *pdwLocale,
|
||
CSPLATFORM *pPlatform)
|
||
{
|
||
HRESULT hr;
|
||
m_CommandText = (LPOLESTR)CoTaskMemAlloc (sizeof(WCHAR) * (wcslen(szCommandText)+1));
|
||
if (!m_CommandText)
|
||
return E_OUTOFMEMORY;
|
||
wcscpy(m_CommandText, szCommandText);
|
||
m_dwAppFlags = dwAppFlags;
|
||
|
||
if (pdwLocale)
|
||
{
|
||
m_pdwLocale = (DWORD *) CoTaskMemAlloc(sizeof(DWORD));
|
||
*m_pdwLocale = *pdwLocale;
|
||
}
|
||
|
||
if (pPlatform)
|
||
{
|
||
m_pPlatform = (CSPLATFORM *) CoTaskMemAlloc(sizeof(CSPLATFORM));
|
||
memcpy (m_pPlatform, pPlatform, sizeof(CSPLATFORM));
|
||
}
|
||
|
||
hr = ExecuteQuery (m_pIDBCreateCommand,
|
||
szCommandText,
|
||
PACKAGEENUM_COLUMN_COUNT,
|
||
NULL,
|
||
&m_HAcc,
|
||
&m_pIAccessor,
|
||
&m_pIRow
|
||
);
|
||
if (FAILED(hr))
|
||
{
|
||
return hr;
|
||
}
|
||
|
||
return S_OK;
|
||
}
|
||
|
||
CEnumPackage::~CEnumPackage()
|
||
{
|
||
if (m_CommandText)
|
||
CoTaskMemFree (m_CommandText);
|
||
if (m_pdwLocale)
|
||
CoTaskMemFree (m_pdwLocale);
|
||
|
||
CloseQuery(m_pIAccessor,
|
||
m_HAcc,
|
||
m_pIRow);
|
||
|
||
EndQuery(m_pIDBCreateCommand);
|
||
}
|
||
|
||
|
||
|