windows-nt/Source/XPSP1/NT/shell/cpls/appwzdui/darenum.cpp
2020-09-26 16:20:57 +08:00

135 lines
3.5 KiB
C++

//---------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation
//
// File: darenum.cpp
//
// The current order of enumeration is Legacy --> Darwin --> SMS
//
// History:
// 2-03-97 by dli
//------------------------------------------------------------------------
#include "priv.h"
// Do not build this file if on Win9X or NT4
#ifndef DOWNLEVEL_PLATFORM
#include "darenum.h"
#include "darapp.h"
#include "util.h"
CDarwinEnumPublishedApps::CDarwinEnumPublishedApps(GUID * pAppCategoryId) : _cRef(1)
{
ASSERT(_bGuidUsed == FALSE);
// Do we have a Catogory GUID?
if (pAppCategoryId)
{
// Yes
_CategoryGUID = *pAppCategoryId;
_bGuidUsed = TRUE;
}
GetManagedApplications(_bGuidUsed ? &_CategoryGUID : NULL, _bGuidUsed ? MANAGED_APPS_FROMCATEGORY : MANAGED_APPS_USERAPPLICATIONS,
MANAGED_APPS_INFOLEVEL_DEFAULT, &_dwNumApps, &_prgApps);
}
CDarwinEnumPublishedApps::~CDarwinEnumPublishedApps()
{
if (_prgApps && (_dwNumApps > 0))
{
LocalFree(_prgApps);
}
}
// IEnumPublishedApps::QueryInterface
HRESULT CDarwinEnumPublishedApps::QueryInterface(REFIID riid, LPVOID * ppvOut)
{
static const QITAB qit[] = {
QITABENT(CDarwinEnumPublishedApps, IEnumPublishedApps), // IID_IEnumPublishedApps
{ 0 },
};
return QISearch(this, qit, riid, ppvOut);
}
// IEnumPublishedApps::AddRef
ULONG CDarwinEnumPublishedApps::AddRef()
{
_cRef++;
TraceMsg(TF_OBJLIFE, "CDarwinEnumPublishedApps()::AddRef called, new _cRef=%lX", _cRef);
return _cRef;
}
// IEnumPublishedApps::Release
ULONG CDarwinEnumPublishedApps::Release()
{
_cRef--;
TraceMsg(TF_OBJLIFE, "CDarwinEnumPublishedApps()::Release called, new _cRef=%lX", _cRef);
if (_cRef > 0)
return _cRef;
delete this;
return 0;
}
// IEnumPublishedApps::Next
// PERF: we should do some optimization instead of enumerating these apps
// one by one.
// S_FALSE means end of enumeration
HRESULT CDarwinEnumPublishedApps::Next(IPublishedApp ** ppia)
{
HRESULT hres = S_FALSE;
*ppia = NULL;
if (_prgApps && (_dwNumApps > 0) && (_dwIndex < _dwNumApps))
{
BOOL bContinue = FALSE;
do {
PMANAGEDAPPLICATION pma = &_prgApps[_dwIndex];
// NOTE: no Hydra machines (_bTSSession == TRUE) we filter out all the
// Darwin apps.
if (pma->pszPackageName && pma->pszPackageName[0])
{
CDarwinPublishedApp *pdpa = new CDarwinPublishedApp(pma);
if (pdpa)
{
*ppia = SAFECAST(pdpa, IPublishedApp *);
hres = S_OK;
}
else
hres = E_OUTOFMEMORY;
bContinue = FALSE;
}
else
{
ClearManagedApplication(pma);
bContinue = TRUE;
}
_dwIndex++;
} while (bContinue && (_dwIndex < _dwNumApps));
}
return hres;
}
// IEnumPublishedApps::Reset
HRESULT CDarwinEnumPublishedApps::Reset(void)
{
if (_prgApps && (_dwNumApps > 0))
{
LocalFree(_prgApps);
}
GetManagedApplications(_bGuidUsed ? &_CategoryGUID : NULL, MANAGED_APPS_USERAPPLICATIONS,
_bGuidUsed ? MANAGED_APPS_FROMCATEGORY : MANAGED_APPS_INFOLEVEL_DEFAULT, &_dwNumApps, &_prgApps);
_dwIndex = 0;
return S_OK;
}
#endif //DOWNLEVEL_PLATFORM