ReactOS 0.4.17-dev-489-g0298e10
CFolderItems Class Reference

#include <CFolderItems.h>

Inheritance diagram for CFolderItems:
Collaboration diagram for CFolderItems:

Public Member Functions

 CFolderItems ()
 
 ~CFolderItems ()
 
HRESULT Initialize (LPCITEMIDLIST idlist, Folder *parent)
 
HWND GetHwnd ()
 
IUnknownGetSite ()
 
STDMETHOD() get_Count (long *plCount) override
 
STDMETHOD() get_Application (IDispatch **ppid) override
 
STDMETHOD() get_Parent (IDispatch **ppid) override
 
STDMETHOD() Item (VARIANT index, FolderItem **ppid) override
 
STDMETHOD() _NewEnum (IUnknown **ppunk) override
 
STDMETHOD() InvokeVerbEx (VARIANT vVerb, VARIANT vArgs) override
 
STDMETHOD() Filter (LONG grfFlags, BSTR bstrFilter) override
 
STDMETHOD() get_Verbs (FolderItemVerbs **ppfic) override
 
- Public Member Functions inherited from ATL::CComObjectRootEx< CComMultiThreadModelNoCS >
 ~CComObjectRootEx ()
 
ULONG InternalAddRef ()
 
ULONG InternalRelease ()
 
void Lock ()
 
void Unlock ()
 
HRESULT _AtlInitialConstruct ()
 
- Public Member Functions inherited from ATL::CComObjectRootBase
 CComObjectRootBase ()
 
 ~CComObjectRootBase ()
 
void SetVoid (void *)
 
HRESULT _AtlFinalConstruct ()
 
HRESULT FinalConstruct ()
 
void InternalFinalConstructAddRef ()
 
void InternalFinalConstructRelease ()
 
void FinalRelease ()
 

Static Public Member Functions

static HRESULT InvokeVerbHelper (HWND hWnd, IContextMenu &cm, VARIANT &vVerb, VARIANT &vArgs, IUnknown *pSite)
 
- Static Public Member Functions inherited from ATL::CComObjectRootBase
static void WINAPI ObjectMain (bool)
 
static const struct _ATL_CATMAP_ENTRYGetCategoryMap ()
 
static HRESULT WINAPI InternalQueryInterface (void *pThis, const _ATL_INTMAP_ENTRY *pEntries, REFIID iid, void **ppvObject)
 

Private Member Functions

void ResetEnum ()
 
BOOL IncludeItem (LPCITEMIDLIST pidl)
 
HRESULT EnumObjects ()
 
HRESULT GetNext (LPITEMIDLIST *ppidl)
 

Static Private Member Functions

static HRESULT CALLBACK ItemsEnumFilter (void *Cookie, LPCITEMIDLIST pidl)
 

Private Attributes

CComHeapPtr< ITEMIDLISTm_idlist
 
CComPtr< IEnumIDListm_EnumIDList
 
CComPtr< Folder > m_Folder
 
long m_Count
 
LONG m_Contf = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS
 
BSTR m_bstrFilter = NULL
 

Additional Inherited Members

- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 

Detailed Description

Definition at line 77 of file CFolderItems.h.

Constructor & Destructor Documentation

◆ CFolderItems()

CFolderItems::CFolderItems ( )

Definition at line 419 of file CFolderItems.cpp.

420 :m_Count(-1)
421{
422}

◆ ~CFolderItems()

CFolderItems::~CFolderItems ( )

Definition at line 424 of file CFolderItems.cpp.

425{
427}
BSTR m_bstrFilter
Definition: CFolderItems.h:88
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271

Member Function Documentation

◆ _NewEnum()

HRESULT STDMETHODCALLTYPE CFolderItems::_NewEnum ( IUnknown **  ppunk)
override

Definition at line 591 of file CFolderItems.cpp.

592{
593 return ShellObjectCreatorInit<CFolderItems>(static_cast<LPITEMIDLIST>(m_idlist), m_Folder, IID_FolderItems, reinterpret_cast<void**>(ppunk));
594}
CComHeapPtr< ITEMIDLIST > m_idlist
Definition: CFolderItems.h:83
CComPtr< Folder > m_Folder
Definition: CFolderItems.h:85
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41

◆ EnumObjects()

HRESULT CFolderItems::EnumObjects ( )
private

Definition at line 460 of file CFolderItems.cpp.

461{
462 if (m_EnumIDList)
463 return S_OK;
464
468 return hr;
469
471 if (FAILED(hr = psf->EnumObjects(NULL, m_Contf, &pEnum)))
472 return hr;
473 hr = pEnum ? S_OK : E_UNEXPECTED;
474 if (SUCCEEDED(hr) && m_bstrFilter)
475 {
476 CComPtr<IEnumIDList> pFilteredEnum;
477 hr = CEnumIDListBase::CreateInstance(*pEnum, ItemsEnumFilter, this, &pFilteredEnum);
478 if (SUCCEEDED(hr))
479 pEnum = pFilteredEnum;
480 }
481
482 if (FAILED(hr))
483 return hr;
484 m_EnumIDList = pEnum;
485 return S_OK;
486}
static HRESULT CreateInstance(IEnumIDList &Source, CREATEINSTANCEFILTERFUNC Filter, void *CallerCookie, IEnumIDList **ppEnum)
CComPtr< IEnumIDList > m_EnumIDList
Definition: CFolderItems.h:84
static HRESULT CALLBACK ItemsEnumFilter(void *Cookie, LPCITEMIDLIST pidl)
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
SHSTDAPI SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_opt_ IBindCtx *pBindCtx, _In_ REFIID riid, _Out_ void **ppvObj)
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define E_UNEXPECTED
Definition: winerror.h:3528
#define IID_PPV_ARG(Itype, ppType)

Referenced by get_Count(), and Item().

◆ Filter()

HRESULT STDMETHODCALLTYPE CFolderItems::Filter ( LONG  grfFlags,
BSTR  bstrFilter 
)
override

Definition at line 605 of file CFolderItems.cpp.

606{
607 if (bstrFilter)
608 {
609 if (!*bstrFilter)
610 bstrFilter = NULL;
611 else if ((bstrFilter = SysAllocString(bstrFilter)) == NULL)
612 return E_OUTOFMEMORY;
613 }
614 ResetEnum();
616 m_bstrFilter = bstrFilter;
617 m_Contf = grfFlags;
618 return S_OK;
619}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238

◆ get_Application()

HRESULT STDMETHODCALLTYPE CFolderItems::get_Application ( IDispatch **  ppid)
override

Definition at line 517 of file CFolderItems.cpp.

518{
519 TRACE("(%p, %p)\n", this, ppid);
520 return m_Folder->get_Application(ppid);
521}
#define TRACE(s)
Definition: solgame.cpp:4

◆ get_Count()

HRESULT STDMETHODCALLTYPE CFolderItems::get_Count ( long plCount)
override

Definition at line 489 of file CFolderItems.cpp.

490{
491 if (!plCount)
492 return E_POINTER;
493
494 if (m_Count == -1)
495 {
496 long count = 0;
497
498 if (FAILED(EnumObjects()))
499 return E_FAIL;
500 HRESULT hr = m_EnumIDList->Reset();
502 return hr;
503
505 while ((hr = GetNext(&Pidl)) == S_OK)
506 {
507 count++;
508 Pidl.Free();
509 }
510 m_Count = count;
511 }
512 *plCount = m_Count;
513
514 return S_OK;
515}
HRESULT GetNext(LPITEMIDLIST *ppidl)
Definition: CFolderItems.h:94
HRESULT EnumObjects()
void Free()
Definition: atlalloc.h:153
#define E_FAIL
Definition: ddrawi.h:102
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define E_POINTER
Definition: winerror.h:3480

Referenced by get_Verbs().

◆ get_Parent()

HRESULT STDMETHODCALLTYPE CFolderItems::get_Parent ( IDispatch **  ppid)
override

Definition at line 523 of file CFolderItems.cpp.

524{
525 TRACE("(%p, %p)\n", this, ppid);
526
527 if (ppid)
528 *ppid = NULL;
529
530 return E_NOTIMPL;
531}
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ get_Verbs()

HRESULT STDMETHODCALLTYPE CFolderItems::get_Verbs ( FolderItemVerbs **  ppfic)
override

Definition at line 621 of file CFolderItems.cpp.

622{
623 if (!ppfic)
624 return E_POINTER;
625
628 if (FAILED(hr))
629 return hr;
630 long count;
631 if (SUCCEEDED(hr = get_Count(&count)) && count)
632 {
635 hr = pVerbs->Init(*static_cast<IContextMenu*>(pCM));
636 }
637 *ppfic = pVerbs.Detach();
638 return S_OK;
639}
static HRESULT GetUIObjectOfFolderItems(FolderItems *pFI, REFIID riid, void **ppv)
T * Detach()
Definition: atlcomcli.h:186
static HRESULT CreateInstance(CComPtr< CFolderItemVerbs > &objref)
STDMETHOD() get_Count(long *plCount) override

◆ GetHwnd()

HWND CFolderItems::GetHwnd ( )
inline

Definition at line 101 of file CFolderItems.h.

101{ return NULL; }

Referenced by InvokeVerbEx().

◆ GetNext()

HRESULT CFolderItems::GetNext ( LPITEMIDLIST ppidl)
inlineprivate

Definition at line 94 of file CFolderItems.h.

94{ return m_EnumIDList->Next(1, ppidl, NULL); }

Referenced by get_Count(), and Item().

◆ GetSite()

IUnknown * CFolderItems::GetSite ( )
inline

Definition at line 102 of file CFolderItems.h.

102{ return NULL; }

Referenced by InvokeVerbEx().

◆ IncludeItem()

BOOL CFolderItems::IncludeItem ( LPCITEMIDLIST  pidl)
private

Definition at line 441 of file CFolderItems.cpp.

442{
443 if (!m_bstrFilter)
444 return TRUE;
445
447 if (FAILED(SHILCombine(m_idlist, pidl, &pidlFull)))
448 return FALSE;
449 CComHeapPtr<WCHAR> pszPath;
450 if (FAILED(SHELL_DisplayNameOf(NULL, pidlFull, SHGDN_FORPARSING | SHGDN_INFOLDER, &pszPath)))
451 return FALSE;
452 return PathMatchSpecW(pszPath, m_bstrFilter);
453}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
BOOL WINAPI PathMatchSpecW(const WCHAR *path, const WCHAR *mask)
Definition: path.c:2497
HRESULT SHELL_DisplayNameOf(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_opt_ UINT Flags, _Out_ PWSTR *ppStr)
Definition: utils.cpp:454

◆ Initialize()

HRESULT CFolderItems::Initialize ( LPCITEMIDLIST  idlist,
Folder *  parent 
)

Definition at line 429 of file CFolderItems.cpp.

430{
432 return SHILClone(idlist, &m_idlist);
433}
r parent
Definition: btrfs.c:3010

◆ InvokeVerbEx()

HRESULT STDMETHODCALLTYPE CFolderItems::InvokeVerbEx ( VARIANT  vVerb,
VARIANT  vArgs 
)
override

Definition at line 596 of file CFolderItems.cpp.

597{
600 if (FAILED(hr))
602 return InvokeVerbHelper(GetHwnd(), *pCM, vVerb, vArgs, GetSite());
603}
HWND GetHwnd()
Definition: CFolderItems.h:101
IUnknown * GetSite()
Definition: CFolderItems.h:102
static HRESULT InvokeVerbHelper(HWND hWnd, IContextMenu &cm, VARIANT &vVerb, VARIANT &vArgs, IUnknown *pSite)
#define S_FALSE
Definition: winerror.h:3451
#define ERROR_NO_DATA
Definition: winerror.h:406
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210

◆ InvokeVerbHelper()

HRESULT CFolderItems::InvokeVerbHelper ( HWND  hWnd,
IContextMenu cm,
VARIANT vVerb,
VARIANT vArgs,
IUnknown pSite 
)
static

Definition at line 641 of file CFolderItems.cpp.

642{
643 PCWSTR pszVerb = V_VT(&vVerb) == VT_BSTR && !StrIsNullOrEmpty(V_BSTR(&vVerb)) ? V_BSTR(&vVerb) : NULL;
644 PCWSTR pszArgs = V_VT(&vArgs) == VT_BSTR && !StrIsNullOrEmpty(V_BSTR(&vArgs)) ? V_BSTR(&vArgs) : NULL;
645 HRESULT hr = SHELL_InvokeCommandOnContextMenu(hWnd, &cm, pszVerb, !!pszVerb, pszArgs, 0, 0, pSite);
646 return SUCCEEDED(hr) ? hr : S_FALSE;
647}
HRESULT SHELL_InvokeCommandOnContextMenu(_In_opt_ HWND hWnd, _In_ IContextMenu *pCM, _In_opt_ PCWSTR pszVerb, _In_ UINT cVerbs, _In_opt_ PCWSTR pszArgs, _In_ UINT fCMIC, _In_ UINT fCMF, _In_opt_ IUnknown *pSite)
HWND hWnd
Definition: settings.c:17
@ VT_BSTR
Definition: compat.h:2303
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
const uint16_t * PCWSTR
Definition: typedefs.h:57

Referenced by CFolderItem::InvokeVerbEx(), and InvokeVerbEx().

◆ Item()

HRESULT STDMETHODCALLTYPE CFolderItems::Item ( VARIANT  index,
FolderItem **  ppid 
)
override

Definition at line 533 of file CFolderItems.cpp.

534{
536 HRESULT hr;
537
539 if (FAILED(hr))
540 return hr;
541
542 if (V_VT(&index) == VT_I2)
544
545 if (V_VT(&index) == VT_I4)
546 {
547 if (FAILED(EnumObjects()))
548 return E_FAIL;
549
551
552 hr = m_EnumIDList->Reset();
554 return hr;
555
556 hr = m_EnumIDList->Skip(count);
557
559 return hr;
560
561 CComHeapPtr<ITEMIDLIST> pidlChild;
562 hr = GetNext(&pidlChild);
564 return hr;
565 if (hr != S_OK)
566 return E_INVALIDARG;
567
569 if (FAILED_UNEXPECTEDLY(hr = SHILCombine(m_idlist, pidlChild, &pidlFull)))
570 return hr;
571 hr = ShellObjectCreatorInit<CFolderItem>(m_Folder, pidlFull, IID_PPV_ARG(FolderItem, ppid));
573 return hr;
574 return hr;
575 }
576 else if (V_VT(&index) == VT_BSTR)
577 {
578 if (!V_BSTR(&index))
579 return S_FALSE;
580
581 hr = m_Folder->ParseName(V_BSTR(&index), ppid);
583 return hr;
584 return hr;
585 }
586
587 FIXME("Index type %d not handled.\n", V_VT(&index));
588 return E_NOTIMPL;
589}
#define index(s, c)
Definition: various.h:29
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_INVALIDARG
Definition: ddrawi.h:101
@ VT_I4
Definition: compat.h:2298
@ VT_I2
Definition: compat.h:2297
GLuint index
Definition: glext.h:6031
const char * var
Definition: shader.c:5666
#define V_UI4(A)
Definition: oleauto.h:270
uint32_t ULONG
Definition: typedefs.h:59
HRESULT WINAPI DECLSPEC_HOTPATCH VariantChangeType(VARIANTARG *pvargDest, VARIANTARG *pvargSrc, USHORT wFlags, VARTYPE vt)
Definition: variant.c:962
HRESULT WINAPI VariantCopyInd(VARIANT *pvargDest, VARIANTARG *pvargSrc)
Definition: variant.c:847

◆ ItemsEnumFilter()

HRESULT CALLBACK CFolderItems::ItemsEnumFilter ( void Cookie,
LPCITEMIDLIST  pidl 
)
staticprivate

Definition at line 455 of file CFolderItems.cpp.

456{
457 return ((CFolderItems*)Cookie)->IncludeItem(pidl) ? S_OK : S_FALSE;
458}
_In_opt_ PVOID _Out_ PLARGE_INTEGER Cookie
Definition: cmfuncs.h:14

Referenced by EnumObjects().

◆ ResetEnum()

void CFolderItems::ResetEnum ( )
private

Definition at line 435 of file CFolderItems.cpp.

436{
438 m_Count = -1;
439}

Referenced by Filter().

Member Data Documentation

◆ m_bstrFilter

BSTR CFolderItems::m_bstrFilter = NULL
private

Definition at line 88 of file CFolderItems.h.

Referenced by EnumObjects(), Filter(), IncludeItem(), and ~CFolderItems().

◆ m_Contf

LONG CFolderItems::m_Contf = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS
private

Definition at line 87 of file CFolderItems.h.

Referenced by EnumObjects(), and Filter().

◆ m_Count

long CFolderItems::m_Count
private

Definition at line 86 of file CFolderItems.h.

Referenced by get_Count(), and ResetEnum().

◆ m_EnumIDList

CComPtr<IEnumIDList> CFolderItems::m_EnumIDList
private

Definition at line 84 of file CFolderItems.h.

Referenced by EnumObjects(), get_Count(), Item(), and ResetEnum().

◆ m_Folder

CComPtr<Folder> CFolderItems::m_Folder
private

Definition at line 85 of file CFolderItems.h.

Referenced by _NewEnum(), get_Application(), Initialize(), and Item().

◆ m_idlist

CComHeapPtr<ITEMIDLIST> CFolderItems::m_idlist
private

Definition at line 83 of file CFolderItems.h.

Referenced by _NewEnum(), EnumObjects(), IncludeItem(), Initialize(), and Item().


The documentation for this class was generated from the following files: