windows-nt/Source/XPSP1/NT/admin/services/sched/folderui/enum.cxx
2020-09-26 16:20:57 +08:00

431 lines
9.1 KiB
C++

//____________________________________________________________________________
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995 - 1996.
//
// File: enum.cxx
//
// Contents: Implementation of IEnumIDList
//
// Classes:
//
// Functions:
//
// History: 1/5/1996 RaviR Created
//
//____________________________________________________________________________
#include "..\pch\headers.hxx"
#pragma hdrstop
#include "dbg.h"
#include "macros.h"
#include "..\inc\common.hxx"
#include "..\inc\policy.hxx"
#include "dll.hxx"
#include "jobidl.hxx"
#include "util.hxx"
#include "bitflag.hxx"
//#undef DEB_TRACE
//#define DEB_TRACE DEB_USER1
//
// Private flags
//
#define JE_LOCAL 0x0001
#define JE_ENUMERATED_TEMPLATE 0x0002
//____________________________________________________________________________
//
// Class: CJobsEnum
//
// Purpose: Enumerates jobs in a folder.
//
// History: 1/25/1996 RaviR Created
//____________________________________________________________________________
class CJobsEnum : public IEnumIDList,
public CBitFlag
{
public:
CJobsEnum(ULONG uFlags, LPCTSTR pszFolderPath, IEnumWorkItems *pEnumJobs);
~CJobsEnum(void);
// IUnknown methods
DECLARE_STANDARD_IUNKNOWN;
// IEnumIDList methods
STDMETHOD(Next)(ULONG celt, LPITEMIDLIST* rgelt, ULONG* pceltFetched);
STDMETHOD(Skip)(ULONG celt);
STDMETHOD(Reset)(void);
STDMETHOD(Clone)(IEnumIDList** ppenum);
private:
ULONG m_uShellFlags; // SHCONTF flags passed in by shell
IEnumWorkItems * m_pEnumJobs;
LPCTSTR m_pszFolderPath;
CDllRef m_DllRef;
};
//____________________________________________________________________________
//
// Member: CJobsEnum::CJobsEnum, Constructor
//
// History: 1/5/1996 RaviR Created
//
//____________________________________________________________________________
inline
CJobsEnum::CJobsEnum(
ULONG uFlags,
LPCTSTR pszFolderPath,
IEnumWorkItems * pEnumJobs)
:
m_ulRefs(1),
m_uShellFlags(uFlags),
m_pEnumJobs(pEnumJobs),
m_pszFolderPath(pszFolderPath)
{
TRACE(CJobsEnum, CJobsEnum);
DEBUG_OUT((DEB_USER1, "FolderPath = %ws\n", pszFolderPath));
if (IsLocalFilename(pszFolderPath))
{
_SetFlag(JE_LOCAL);
}
Win4Assert(m_pEnumJobs != NULL);
m_pEnumJobs->AddRef();
//
// Policy - do not allow the template item if we are not
// allowing job creation
// -- Later, we prevent this flag from being cleared
//
if (RegReadPolicyKey(TS_KEYPOLICY_DENY_CREATE_TASK))
{
DEBUG_OUT((DEB_ITRACE, "Policy CREATE_TASK active - no template wizard\n"));
//
// This next flag means that we have ALREADY shown the template.
// Setting it will force us never to enumerate it
//
_SetFlag(JE_ENUMERATED_TEMPLATE);
}
}
//____________________________________________________________________________
//
// Member: CJobsEnum::~CJobsEnum, Destructor
//____________________________________________________________________________
inline
CJobsEnum::~CJobsEnum()
{
TRACE(CJobsEnum, ~CJobsEnum);
if (m_pEnumJobs != NULL)
{
m_pEnumJobs->Release();
}
// Note: No need to free m_pszFolderPath.
}
//____________________________________________________________________________
//
// Member: IUnknown methods
//____________________________________________________________________________
IMPLEMENT_STANDARD_IUNKNOWN(CJobsEnum);
STDMETHODIMP
CJobsEnum::QueryInterface(REFIID riid, LPVOID* ppvObj)
{
if (IsEqualIID(IID_IUnknown, riid) ||
IsEqualIID(IID_IEnumIDList, riid))
{
*ppvObj = (IUnknown*)(IEnumIDList*) this;
this->AddRef();
return S_OK;
}
*ppvObj = NULL;
return E_NOINTERFACE;
}
//____________________________________________________________________________
//
// Member: CJobsEnum::IEnumIDList::Next
//
// Arguments: [celt] -- IN
// [ppidlOut] -- IN
// [pceltFetched] -- IN
//
// Returns: HRESULT.
//
// History: 1/5/1996 RaviR Created
// 2-12-1997 DavidMun Handle NULL pceltFetched
//
//____________________________________________________________________________
STDMETHODIMP
CJobsEnum::Next(
ULONG celt,
LPITEMIDLIST* ppidlOut,
ULONG* pceltFetched)
{
TRACE(CJobsEnum, Next);
HRESULT hr = S_OK;
CJobID jid;
if (!(m_uShellFlags & SHCONTF_NONFOLDERS))
{
return S_FALSE;
}
if (m_pEnumJobs == NULL)
{
return E_FAIL;
}
if (pceltFetched == NULL && celt != 1)
{
return E_INVALIDARG;
}
if (pceltFetched)
{
*pceltFetched = 0;
}
ULONG curr = 0;
LPWSTR * ppwszJob = NULL;
ULONG ulTemp;
if (_IsFlagSet(JE_LOCAL) &&
!_IsFlagSet(JE_ENUMERATED_TEMPLATE) &&
celt)
{
jid.InitToTemplate();
ppidlOut[curr] = ILClone((LPCITEMIDLIST)(&jid));
if (!ppidlOut[curr])
{
return E_OUTOFMEMORY;
}
DEBUG_OUT((DEB_ITRACE, "Created template\n"));
curr++;
_SetFlag(JE_ENUMERATED_TEMPLATE);
}
while (curr < celt)
{
hr = m_pEnumJobs->Next(1, &ppwszJob, &ulTemp);
CHECK_HRESULT(hr);
if (FAILED(hr))
{
break;
}
else if (ulTemp == 0)
{
hr = S_FALSE;
break;
}
LPTSTR pszJob = (LPTSTR)*ppwszJob;
#if !defined(UNICODE)
char szBuff[MAX_PATH];
UnicodeToAnsi(szBuff, *ppwszJob, MAX_PATH);
pszJob = szBuff;
#endif
hr = jid.Load(m_pszFolderPath, pszJob);
CoTaskMemFree(*ppwszJob);
CoTaskMemFree(ppwszJob);
if (S_OK == hr)
{
ppidlOut[curr] = ILClone((LPCITEMIDLIST)(&jid));
if (NULL != ppidlOut[curr])
{
++curr;
hr = S_OK;
}
else
{
hr = E_OUTOFMEMORY;
}
}
if (hr == E_OUTOFMEMORY)
{
break;
}
}
if (curr > 0 && curr < celt)
{
hr = S_FALSE;
}
if (pceltFetched)
{
*pceltFetched = curr;
}
return hr;
}
//____________________________________________________________________________
//
// Member: CJobsEnum::Skip
//
// Arguments: [celt] -- IN
//
// Returns: HRESULT.
//
// History: 1/5/1996 RaviR Created
//
//____________________________________________________________________________
STDMETHODIMP
CJobsEnum::Skip(
ULONG celt)
{
TRACE(CJobsEnum, Skip);
if (!celt)
{
return E_INVALIDARG;
}
if (_IsFlagSet(JE_LOCAL) && !_IsFlagSet(JE_ENUMERATED_TEMPLATE))
{
celt--;
_SetFlag(JE_ENUMERATED_TEMPLATE);
if (!celt)
{
return S_OK;
}
}
return m_pEnumJobs->Skip(celt);
}
//____________________________________________________________________________
//
// Member: CJobsEnum::Reset
//
// Returns: HRESULT.
//
// History: 1/5/1996 RaviR Created
//
//____________________________________________________________________________
STDMETHODIMP
CJobsEnum::Reset(void)
{
TRACE(CJobsEnum, Reset);
//
// Policy - don't clear flag if we are not allowing job creation
//
if (! RegReadPolicyKey(TS_KEYPOLICY_DENY_CREATE_TASK))
{
DEBUG_OUT((DEB_ITRACE, "Policy CREATE_TASK active - prevent template wiz\n"));
//
// Not clearing this flag maintains that we will have enumerated
// the template on the next go around
//
_ClearFlag(JE_ENUMERATED_TEMPLATE);
}
return m_pEnumJobs->Reset();
}
//____________________________________________________________________________
//
// Member: CJobsEnum::Clone
//
// Arguments: [ppenum] -- IN
//
// Returns: HRESULT.
//
// History: 1/5/1996 RaviR Created
//
//____________________________________________________________________________
STDMETHODIMP
CJobsEnum::Clone(
IEnumIDList** ppenum)
{
TRACE(CJobsEnum, Clone);
return E_FAIL; // not supported
}
//____________________________________________________________________________
//
// Function: JFGetEnumIDList
//
// Synopsis: Function to create the object to enumearte the JobIDList
//
// Arguments: [uFlags] -- IN
// [pszFolderPath] -- IN
// [pEnumJobs] -- IN
// [riid] -- IN
// [ppvObj] -- OUT
//
// Returns: HRESULT
//
// History: 1/24/1996 RaviR Created
//
//____________________________________________________________________________
HRESULT
JFGetEnumIDList(
ULONG uFlags,
LPCTSTR pszFolderPath,
IEnumWorkItems * pEnumJobs,
LPVOID * ppvObj)
{
CJobsEnum * pEnum = new CJobsEnum(uFlags, pszFolderPath, pEnumJobs);
if (NULL == pEnum)
{
CHECK_HRESULT(E_OUTOFMEMORY);
return E_OUTOFMEMORY;
}
pEnumJobs->Reset();
HRESULT hr = pEnum->QueryInterface(IID_IEnumIDList, ppvObj);
pEnum->Release();
return hr;
}