ReactOS 0.4.16-dev-1163-gec5b142
CRegFolder Class Reference
Inheritance diagram for CRegFolder:
Collaboration diagram for CRegFolder:

Public Member Functions

 CRegFolder ()
 
 ~CRegFolder ()
 
HRESULT WINAPI Initialize (PREGFOLDERINITDATA pInit, LPCITEMIDLIST pidlRoot)
 
const REQUIREDREGITEMIsRequiredItem (LPCITEMIDLIST pidl) const
 
STDMETHOD() ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override
 
STDMETHOD() EnumObjects (HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
 
STDMETHOD() BindToObject (PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
 
STDMETHOD() BindToStorage (PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
 
STDMETHOD() CompareIDs (LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
 
STDMETHOD() CreateViewObject (HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
 
STDMETHOD() GetAttributesOf (UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
 
STDMETHOD() GetUIObjectOf (HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
 
STDMETHOD() GetDisplayNameOf (PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
 
STDMETHOD() SetNameOf (HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
 
STDMETHOD() GetDefaultSearchGUID (GUID *pguid) override
 
STDMETHOD() EnumSearches (IEnumExtraSearch **ppenum) override
 
STDMETHOD() GetDefaultColumn (DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
 
STDMETHOD() GetDefaultColumnState (UINT iColumn, DWORD *pcsFlags) override
 
STDMETHOD() GetDetailsEx (PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override
 
STDMETHOD() GetDetailsOf (PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
 
STDMETHOD() MapColumnToSCID (UINT column, SHCOLUMNID *pscid) 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 ()
 
HRESULT GetDefaultSearchGUID ([out] GUID *lpguid)
 
HRESULT EnumSearches ([out] IEnumExtraSearch **ppenum)
 
HRESULT GetDefaultColumn ([in] DWORD dwReserved, [out] ULONG *pSort, [out] ULONG *pDisplay)
 
HRESULT GetDefaultColumnState ([in] UINT iColumn, [out] SHCOLSTATEF *pcsFlags)
 
HRESULT GetDetailsEx ([in] PCUITEMID_CHILD pidl, [in] const SHCOLUMNID *pscid, [out] VARIANT *pv)
 
HRESULT GetDetailsOf ([in] PCUITEMID_CHILD pidl, [in] UINT iColumn, [out] SHELLDETAILS *psd)
 
HRESULT MapColumnToSCID ([in] UINT iColumn, [in] SHCOLUMNID *pscid)
 
- Public Member Functions inherited from IShellFolder
HRESULT ParseDisplayName ([in] HWND hwndOwner, [in] LPBC pbcReserved, [in, string] LPOLESTR lpszDisplayName, [out] ULONG *pchEaten, [out] PIDLIST_RELATIVE *ppidl, [in, out, unique] ULONG *pdwAttributes)
 
HRESULT EnumObjects ([in] HWND hwndOwner, [in] SHCONTF grfFlags, [out] IEnumIDList **ppenumIDList)
 
HRESULT BindToObject ([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
 
HRESULT BindToStorage ([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvObj)
 
HRESULT CompareIDs ([in] LPARAM lParam, [in] PCUIDLIST_RELATIVE pidl1, [in] PCUIDLIST_RELATIVE pidl2)
 
HRESULT CreateViewObject ([in] HWND hwndOwner, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
 
HRESULT GetAttributesOf ([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
 
HRESULT GetUIObjectOf ([in] HWND hwndOwner, [in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in] REFIID riid, [in, out, unique] UINT *prgfInOut, [out, iid_is(riid)] void **ppvOut)
 
HRESULT GetDisplayNameOf ([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
 
HRESULT SetNameOf ([in] HWND hwnd, [in] PCUITEMID_CHILD pidl, [in, string] LPCOLESTR lpszName, [in] SHGDNF uFlags, [out] PITEMID_CHILD *ppidlOut)
 
- Public Member Functions inherited from IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 
- Public Member Functions inherited from CRegFolderInfo
void InitializeFolderInfo (const REGFOLDERINFO *pInfo)
 
const CLSIDIsRegItem (LPCITEMIDLIST pidl) const
 
LPITEMIDLIST CreateItem (size_t i) const
 
WORD GetRegItemOrder (LPCITEMIDLIST pidl) const
 
LPCWSTR GetParsingPath () const
 
UINT GetCLSIDOffset () const
 
PIDLTYPE GetPidlType () const
 
UINT GetRequiredItemsCount () const
 
const REQUIREDREGITEMGetAt (size_t i) const
 

Private Member Functions

HRESULT CompareRegItemsSortOrder (PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2)
 
HRESULT GetGuidItemAttributes (LPCITEMIDLIST pidl, LPDWORD pdwAttributes)
 
BOOL _IsInNameSpace (_In_ LPCITEMIDLIST pidl)
 

Private Attributes

IShellFolderm_pOuterFolder
 
CComHeapPtr< ITEMIDLISTm_pidlRoot
 

Additional Inherited Members

- Public Types inherited from IShellFolder2
typedef struct IShellFolder2::SHCOLUMNIDLPSHCOLUMNID
 
typedef const SHCOLUMNIDLPCSHCOLUMNID
 
- Public Types inherited from IShellFolder
enum  tagSHGDN {
  SHGDN_NORMAL = 0 , SHGDN_INFOLDER = 1 , SHGDN_FOREDITING = 0x1000 , SHGDN_INCLUDE_NONFILESYS = 0x2000 ,
  SHGDN_FORADDRESSBAR = 0x4000 , SHGDN_FORPARSING = 0x8000
}
 
enum  tagSHCONTF {
  SHCONTF_FOLDERS = 32 , SHCONTF_NONFOLDERS = 64 , SHCONTF_INCLUDEHIDDEN = 128 , SHCONTF_INIT_ON_FIRST_NEXT = 256 ,
  SHCONTF_NETPRINTERSRCH = 512 , SHCONTF_SHAREABLE = 1024 , SHCONTF_STORAGE = 2048 , SHCONTF_NAVIGATION_ENUM = 0x01000 ,
  SHCONTF_FASTITEMS = 0x02000 , SHCONTF_FLATLIST = 0x04000 , SHCONTF_ENABLE_ASYNC = 0x08000 , SHCONTF_INCLUDESUPERHIDDEN = 0x10000
}
 
typedef IShellFolderLPSHELLFOLDER
 
typedef enum IShellFolder::tagSHGDN SHGNO
 
typedef DWORD SHGDNF
 
typedef DWORD SHCONTF
 
typedef ULONG SFGAOF
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 
- 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)
 
- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 
- Public Attributes inherited from CRegFolderInfo
const REGFOLDERINFOm_pInfo
 

Detailed Description

Definition at line 321 of file CRegFolder.cpp.

Constructor & Destructor Documentation

◆ CRegFolder()

CRegFolder::CRegFolder ( )

Definition at line 382 of file CRegFolder.cpp.

383{
384}

◆ ~CRegFolder()

CRegFolder::~CRegFolder ( )

Definition at line 386 of file CRegFolder.cpp.

387{
388}

Member Function Documentation

◆ _IsInNameSpace()

BOOL CRegFolder::_IsInNameSpace ( _In_ LPCITEMIDLIST  pidl)
private

Definition at line 424 of file CRegFolder.cpp.

425{
427 if (IsEqualGUID(clsid, CLSID_Printers))
428 return TRUE;
429 if (IsEqualGUID(clsid, CLSID_NetworkConnections))
430 return TRUE;
431 FIXME("Check registry\n");
432 return TRUE;
433}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define TRUE
Definition: types.h:120
REFCLSID clsid
Definition: msctf.c:82
IID * _ILGetGUIDPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2407
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147

Referenced by ParseDisplayName().

◆ BindToObject()

HRESULT WINAPI CRegFolder::BindToObject ( PCUIDLIST_RELATIVE  pidl,
LPBC  pbcReserved,
REFIID  riid,
LPVOID ppvOut 
)
override

Definition at line 502 of file CRegFolder.cpp.

503{
504 CComPtr<IPersistFolder> pFolder;
505 HRESULT hr;
506
507 if (!ppvOut || !pidl || !pidl->mkid.cb)
508 return E_INVALIDARG;
509
510 *ppvOut = NULL;
511
512 GUID *pGUID = _ILGetGUIDPointer(pidl);
513 if (!pGUID)
514 {
515 ERR("CRegFolder::BindToObject called for non guid item!\n");
516 return E_INVALIDARG;
517 }
518
519 hr = SHELL32_BindToSF(m_pidlRoot, NULL, pidl, pGUID, riid, ppvOut);
521 return hr;
522
523 return S_OK;
524}
#define ERR(fmt,...)
Definition: precomp.h:57
CComHeapPtr< ITEMIDLIST > m_pidlRoot
Definition: CRegFolder.cpp:328
#define E_INVALIDARG
Definition: ddrawi.h:101
#define NULL
Definition: types.h:112
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:65
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:293
HRESULT hr
Definition: shlfolder.c:183

◆ BindToStorage()

HRESULT WINAPI CRegFolder::BindToStorage ( PCUIDLIST_RELATIVE  pidl,
LPBC  pbcReserved,
REFIID  riid,
LPVOID ppvOut 
)
override

Definition at line 526 of file CRegFolder.cpp.

527{
528 return E_NOTIMPL;
529}
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ CompareIDs()

HRESULT WINAPI CRegFolder::CompareIDs ( LPARAM  lParam,
PCUIDLIST_RELATIVE  pidl1,
PCUIDLIST_RELATIVE  pidl2 
)
override

Implements IShellFolder.

Definition at line 543 of file CRegFolder.cpp.

544{
545 if (!pidl1 || !pidl2 || pidl1->mkid.cb == 0 || pidl2->mkid.cb == 0)
546 {
547 ERR("Got an empty pidl!\n");
548 return E_INVALIDARG;
549 }
550
551 GUID const *clsid1 = _ILGetGUIDPointer (pidl1);
552 GUID const *clsid2 = _ILGetGUIDPointer (pidl2);
553
554 if (!clsid1 && !clsid2)
555 {
556 ERR("Got no guid pidl!\n");
557 return E_INVALIDARG;
558 }
559 else if (clsid1 && clsid2)
560 {
561 if ((lParam & SHCIDS_COLUMNMASK) == COL_NAME && !(lParam & SHCIDS_CANONICALONLY))
562 {
563 HRESULT hrCmpOrder = CompareRegItemsSortOrder(pidl1, pidl2);
564 if (hrCmpOrder && SUCCEEDED(hrCmpOrder))
565 return hrCmpOrder;
566 }
567 if (memcmp(clsid1, clsid2, sizeof(GUID)) == 0)
568 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
569
570 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
571 }
572
573 /* Guid folders come first compared to everything else */
574 /* And Drives come before folders in My Computer */
576 return MAKE_COMPARE_HRESULT(clsid1 ? 1 : -1);
577 else
578 return MAKE_COMPARE_HRESULT(clsid1 ? -1 : 1);
579}
@ COL_NAME
Definition: CRegFolder.cpp:315
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
HRESULT CompareRegItemsSortOrder(PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2)
Definition: CRegFolder.cpp:531
LPARAM lParam
Definition: combotst.c:139
#define SHCIDS_CANONICALONLY
Definition: shobjidl.idl:226
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define PT_COMPUTER_REGITEM
Definition: lnktool.cpp:39
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:663
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:349
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:372
PIDLTYPE GetPidlType() const
Definition: CRegFolder.cpp:136

◆ CompareRegItemsSortOrder()

HRESULT CRegFolder::CompareRegItemsSortOrder ( PCUIDLIST_RELATIVE  pidl1,
PCUIDLIST_RELATIVE  pidl2 
)
private

Definition at line 531 of file CRegFolder.cpp.

532{
533 LPPIDLDATA p1 = (LPPIDLDATA)pidl1->mkid.abID;
534 LPPIDLDATA p2 = (LPPIDLDATA)pidl2->mkid.abID;
535 int Order1 = p1->u.guid.uSortOrder > 0x40 ? p1->u.guid.uSortOrder : GetRegItemOrder(pidl1);
536 int Order2 = p2->u.guid.uSortOrder > 0x40 ? p2->u.guid.uSortOrder : GetRegItemOrder(pidl2);
537 int Cmp = Order1 - Order2;
538 if (Cmp != 0)
539 return MAKE_COMPARE_HRESULT(Cmp);
540 return SHELL32_CompareDetails(this, COL_NAME, pidl1, pidl2);
541}
struct tagPIDLDATA * LPPIDLDATA
WORD GetRegItemOrder(LPCITEMIDLIST pidl) const
Definition: CRegFolder.cpp:128
union tagPIDLDATA::@596 u
struct tagGUIDStruct guid
Definition: pidl.h:233

Referenced by CompareIDs().

◆ CreateViewObject()

HRESULT WINAPI CRegFolder::CreateViewObject ( HWND  hwndOwner,
REFIID  riid,
LPVOID ppvOut 
)
override

Definition at line 581 of file CRegFolder.cpp.

582{
583 return E_NOTIMPL;
584}

◆ EnumObjects()

HRESULT WINAPI CRegFolder::EnumObjects ( HWND  hwndOwner,
DWORD  dwFlags,
LPENUMIDLIST *  ppEnumIDList 
)
override

Definition at line 496 of file CRegFolder.cpp.

497{
498 return ShellObjectCreatorInit<CRegFolderEnum>(m_pInfo, m_pOuterFolder, dwFlags,
499 IID_PPV_ARG(IEnumIDList, ppEnumIDList));
500}
IShellFolder * m_pOuterFolder
Definition: CRegFolder.cpp:327
const REGFOLDERINFO * m_pInfo
Definition: CRegFolder.cpp:98
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
#define IID_PPV_ARG(Itype, ppType)

◆ EnumSearches()

HRESULT WINAPI CRegFolder::EnumSearches ( IEnumExtraSearch **  ppenum)
override

Implements IShellFolder2.

Definition at line 828 of file CRegFolder.cpp.

829{
830 return E_NOTIMPL;
831}

◆ GetAttributesOf()

HRESULT WINAPI CRegFolder::GetAttributesOf ( UINT  cidl,
PCUITEMID_CHILD_ARRAY  apidl,
DWORD rgfInOut 
)
override

Definition at line 586 of file CRegFolder.cpp.

587{
588 if (!rgfInOut || !cidl || !apidl)
589 return E_INVALIDARG;
590
591 if (*rgfInOut == 0)
592 *rgfInOut = ~0;
593
594 while(cidl > 0 && *apidl)
595 {
596 if (_ILIsSpecialFolder(*apidl))
597 GetGuidItemAttributes(*apidl, rgfInOut);
598 else
599 ERR("Got unknown pidl\n");
600 apidl++;
601 cidl--;
602 }
603
604 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
605 *rgfInOut &= ~SFGAO_VALIDATE;
606
607 return S_OK;
608}
HRESULT GetGuidItemAttributes(LPCITEMIDLIST pidl, LPDWORD pdwAttributes)
Definition: CRegFolder.cpp:402
BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2119

◆ GetDefaultColumn()

HRESULT WINAPI CRegFolder::GetDefaultColumn ( DWORD  dwRes,
ULONG pSort,
ULONG pDisplay 
)
override

Implements IShellFolder2.

Definition at line 833 of file CRegFolder.cpp.

834{
835 if (pSort)
836 *pSort = 0;
837 if (pDisplay)
838 *pDisplay = 0;
839
840 return S_OK;
841}

◆ GetDefaultColumnState()

HRESULT WINAPI CRegFolder::GetDefaultColumnState ( UINT  iColumn,
DWORD pcsFlags 
)
override

Implements IShellFolder2.

Definition at line 843 of file CRegFolder.cpp.

844{
845 if (iColumn >= REGFOLDERCOLUMNCOUNT)
846 return E_INVALIDARG;
848 return S_OK;
849}
@ REGFOLDERCOLUMNCOUNT
Definition: CRegFolder.cpp:318
@ SHCOLSTATE_TYPE_STR
Definition: shtypes.idl:121
@ SHCOLSTATE_ONBYDEFAULT
Definition: shtypes.idl:125

◆ GetDefaultSearchGUID()

HRESULT WINAPI CRegFolder::GetDefaultSearchGUID ( GUID pguid)
override

Implements IShellFolder2.

Definition at line 823 of file CRegFolder.cpp.

824{
825 return E_NOTIMPL;
826}

◆ GetDetailsEx()

HRESULT WINAPI CRegFolder::GetDetailsEx ( PCUITEMID_CHILD  pidl,
const SHCOLUMNID pscid,
VARIANT pv 
)
override

Implements IShellFolder2.

Definition at line 851 of file CRegFolder.cpp.

852{
853 const CLSID *pCLSID = IsRegItem(pidl);
854 if (!pCLSID)
855 return E_INVALIDARG;
856 if (pscid->fmtid == FMTID_ShellDetails)
857 {
858 switch (pscid->pid)
859 {
862 }
863 }
864 return SH32_GetDetailsOfPKeyAsVariant(this, pidl, pscid, pv, TRUE);
865}
static HRESULT SHELL_CreateSHDESCRIPTIONID(VARIANT *pVar, DWORD Id, const CLSID *pCLSID)
Definition: shell32_main.h:274
HRESULT SH32_GetDetailsOfPKeyAsVariant(IShellFolder2 *pSF, PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pVar, BOOL UseFsColMap)
Definition: shlfolder.cpp:133
#define PID_DESCRIPTIONID
Definition: shlguid.h:171
#define SHDID_ROOT_REGITEM
Definition: shlobj.h:1464
const CLSID * IsRegItem(LPCITEMIDLIST pidl) const
Definition: CRegFolder.cpp:105

◆ GetDetailsOf()

HRESULT WINAPI CRegFolder::GetDetailsOf ( PCUITEMID_CHILD  pidl,
UINT  iColumn,
SHELLDETAILS psd 
)
override

Implements IShellFolder2.

Definition at line 867 of file CRegFolder.cpp.

868{
869 if (!psd)
870 return E_INVALIDARG;
871
872 if (!pidl)
873 {
874 TRACE("CRegFolder has no column info\n");
875 return E_INVALIDARG;
876 }
877
878 GUID const *clsid = _ILGetGUIDPointer (pidl);
879
880 if (!clsid)
881 {
882 ERR("Pidl is not reg item!\n");
883 return E_INVALIDARG;
884 }
885
886 switch(iColumn)
887 {
888 case COL_NAME:
889 return GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
890 case COL_TYPE:
891 return SHSetStrRet(&psd->str, IDS_SYSTEMFOLDER);
892 case COL_INFOTIP:
893 HKEY hKey;
895 return SHSetStrRetEmpty(&psd->str);
896
897 psd->str.cStr[0] = 0x00;
898 psd->str.uType = STRRET_CSTR;
899 RegLoadMUIStringA(hKey, "InfoTip", psd->str.cStr, MAX_PATH, NULL, 0, NULL);
901 return S_OK;
902 default:
903 /* Return an empty string when we are asked for a column we don't support.
904 Only the regfolder is supposed to do this as it supports fewer columns compared to other folders
905 and its contents are supposed to be presented alongside items that support more columns. */
906 return SHSetStrRetEmpty(&psd->str);
907 }
908 return E_FAIL;
909}
@ COL_INFOTIP
Definition: CRegFolder.cpp:317
@ COL_TYPE
Definition: CRegFolder.cpp:316
#define RegCloseKey(hKey)
Definition: registry.h:49
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CRegFolder.cpp:649
#define E_FAIL
Definition: ddrawi.h:102
LONG WINAPI RegLoadMUIStringA(IN HKEY hKey, IN LPCSTR pszValue OPTIONAL, OUT LPSTR pszOutBuf, IN DWORD cbOutBuf, OUT LPDWORD pcbData OPTIONAL, IN DWORD Flags, IN LPCSTR pszDirectory OPTIONAL)
Definition: reg.c:5268
#define MAX_PATH
Definition: compat.h:34
FxAutoRegKey hKey
BOOL HCR_RegOpenClassIDKey(REFIID riid, HKEY *hkey)
Definition: classes.c:253
#define IDS_SYSTEMFOLDER
Definition: shresdef.h:376
@ STRRET_CSTR
Definition: shtypes.idl:87
#define TRACE(s)
Definition: solgame.cpp:4
STRRET str
Definition: shtypes.idl:108
char cStr[MAX_PATH]
Definition: shtypes.idl:98
UINT uType
Definition: shtypes.idl:93

◆ GetDisplayNameOf()

HRESULT WINAPI CRegFolder::GetDisplayNameOf ( PCUITEMID_CHILD  pidl,
DWORD  dwFlags,
LPSTRRET  strRet 
)
override

Definition at line 649 of file CRegFolder.cpp.

650{
651 if (!strRet || (!_ILIsSpecialFolder(pidl) && pidl != NULL))
652 return E_INVALIDARG;
653
654 if (!pidl || !pidl->mkid.cb)
655 {
657 {
659 {
660 TRACE("GDNO returning INFOLDER instead of %#x\n", GET_SHGDN_RELATION(dwFlags));
661 }
662 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc((2 + 38 + 1) * sizeof(WCHAR));
663 if (!pszPath)
664 return E_OUTOFMEMORY;
665 /* parsing name like ::{...} */
666 pszPath[0] = ':';
667 pszPath[1] = ':';
668 SHELL32_GUIDToStringW(m_pInfo->clsid, &pszPath[2]);
669 strRet->uType = STRRET_WSTR;
670 strRet->pOleStr = pszPath;
671 return S_OK;
672 }
673 else
674 {
675 BOOL bRet;
676 WCHAR wstrName[MAX_PATH+1];
677 bRet = HCR_GetClassNameW(m_pInfo->clsid, wstrName, MAX_PATH);
678 if (!bRet)
679 return E_FAIL;
680
681 return SHSetStrRet(strRet, wstrName);
682 }
683 }
684
685 HRESULT hr;
686 GUID const *clsid = _ILGetGUIDPointer (pidl);
687
688 /* First of all check if we need to query the name from the child item */
691 {
692 int bWantsForParsing = FALSE;
693
694 /*
695 * We can only get a filesystem path from a shellfolder if the
696 * value WantsFORPARSING in CLSID\\{...}\\shellfolder exists.
697 *
698 * Exception: The MyComputer folder doesn't have this key,
699 * but any other filesystem backed folder it needs it.
700 */
701 if (IsEqualIID (*clsid, CLSID_MyComputer))
702 {
703 bWantsForParsing = TRUE;
704 }
705 else
706 {
707 HKEY hkeyClass;
708 if (HCR_RegOpenClassIDKey(*clsid, &hkeyClass))
709 {
710 LONG res = SHGetValueW(hkeyClass, L"Shellfolder", L"WantsForParsing", NULL, NULL, NULL);
711 bWantsForParsing = (res == ERROR_SUCCESS);
712 RegCloseKey(hkeyClass);
713 }
714 }
715
716 if (bWantsForParsing)
717 {
718 /*
719 * we need the filesystem path to the destination folder.
720 * Only the folder itself can know it
721 */
722 return SHELL32_GetDisplayNameOfChild (this, pidl, dwFlags, strRet);
723 }
724 }
725
726 /* Allocate the buffer for the result */
727 SIZE_T cchPath = MAX_PATH + 1;
728 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc(cchPath * sizeof(WCHAR));
729 if (!pszPath)
730 return E_OUTOFMEMORY;
731
732 hr = S_OK;
733
735 {
736 SIZE_T pathlen = 0;
737 PWCHAR pItemName = pszPath; // GET_SHGDN_RELATION(dwFlags) == SHGDN_INFOLDER
739 {
740 hr = StringCchCopyW(pszPath, cchPath, GetParsingPath());
741 if (SUCCEEDED(hr))
742 {
743 pathlen = wcslen(pszPath);
744 pItemName = &pszPath[pathlen];
745 if (pathlen)
746 {
747 if (++pathlen < cchPath)
748 *pItemName++ = L'\\';
749 else
751 }
752 }
753 }
754
755 if (SUCCEEDED(hr) && pathlen + 2 + 38 + 1 < cchPath)
756 {
757 /* parsing name like ::{...} */
758 pItemName[0] = L':';
759 pItemName[1] = L':';
760 SHELL32_GUIDToStringW(*clsid, &pItemName[2]);
761 }
762 else
763 {
765 }
766 }
767 else
768 {
769 /* user friendly name */
770 if (!HCR_GetClassNameW(*clsid, pszPath, cchPath))
771 hr = E_FAIL;
772 }
773
774 if (SUCCEEDED(hr))
775 {
776 strRet->uType = STRRET_WSTR;
777 strRet->pOleStr = pszPath;
778 }
779 else
780 {
781 CoTaskMemFree(pszPath);
782 }
783
784 return hr;
785}
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define ERROR_SUCCESS
Definition: deptool.c:10
#define FALSE
Definition: types.h:117
#define GET_SHGDN_RELATION(dwFlags)
Definition: precomp.h:53
#define GET_SHGDN_FOR(dwFlags)
Definition: precomp.h:52
DWORD WINAPI SHGetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
Definition: reg.c:1236
unsigned int BOOL
Definition: ntddk_ex.h:94
GLuint res
Definition: glext.h:9613
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define L(x)
Definition: ntvdm.h:50
long LONG
Definition: pedump.c:60
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len)
Definition: classes.c:422
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:331
#define IS_SHGDN_FOR_PARSING(flags)
Definition: shfldr.h:78
static __inline int SHELL32_GUIDToStringW(REFGUID guid, LPWSTR str)
Definition: shfldr.h:162
@ STRRET_WSTR
Definition: shtypes.idl:85
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
LPCWSTR GetParsingPath() const
Definition: CRegFolder.cpp:134
REFCLSID clsid
Definition: shfldr.h:63
LPWSTR pOleStr
Definition: shtypes.idl:96
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint16_t * PWCHAR
Definition: typedefs.h:56
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by GetDetailsOf().

◆ GetGuidItemAttributes()

HRESULT CRegFolder::GetGuidItemAttributes ( LPCITEMIDLIST  pidl,
LPDWORD  pdwAttributes 
)
private

Definition at line 402 of file CRegFolder.cpp.

403{
404 DWORD dwAttributes = *pdwAttributes;
405
406 /* First try to get them from the registry */
407 if (!HCR_GetFolderAttributes(pidl, pdwAttributes))
408 {
409 /* We couldn't get anything */
410 *pdwAttributes = 0;
411 }
412
413 /* Items have more attributes when on desktop */
415 {
416 *pdwAttributes |= (dwAttributes & (SFGAO_CANLINK|SFGAO_CANDELETE|SFGAO_CANRENAME|SFGAO_HASPROPSHEET));
417 }
418
419 /* In any case, links can be created */
420 *pdwAttributes |= (dwAttributes & SFGAO_CANLINK);
421 return S_OK;
422}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
unsigned long DWORD
Definition: ntddk_ex.h:95
BOOL HCR_GetFolderAttributes(LPCITEMIDLIST pidlFolder, LPDWORD pdwAttributes)
Definition: classes.c:590
DWORD dwAttributes
Definition: vdmdbg.h:34

Referenced by GetAttributesOf(), and ParseDisplayName().

◆ GetUIObjectOf()

HRESULT WINAPI CRegFolder::GetUIObjectOf ( HWND  hwndOwner,
UINT  cidl,
PCUITEMID_CHILD_ARRAY  apidl,
REFIID  riid,
UINT prgfInOut,
LPVOID ppvOut 
)
override

Definition at line 610 of file CRegFolder.cpp.

612{
613 LPVOID pObj = NULL;
615
616 if (!ppvOut)
617 return hr;
618
619 *ppvOut = NULL;
620
621 if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
622 {
623 hr = CGuidItemExtractIcon_CreateInstance(apidl[0], riid, &pObj);
624 }
625 else if (IsEqualIID (riid, IID_IContextMenu) && (cidl >= 1))
626 {
627 if (!_ILGetGUIDPointer (apidl[0]))
628 {
629 ERR("Got non guid item!\n");
630 return E_FAIL;
631 }
632
633 hr = CRegItemContextMenu_CreateInstance(m_pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), (IContextMenu**)&pObj);
634 }
635 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
636 {
637 hr = IDataObject_Constructor (hwndOwner, m_pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
638 }
639 else
640 {
642 }
643
644 *ppvOut = pObj;
645 return hr;
646
647}
HRESULT IDataObject_Constructor(HWND hwndOwner, PCIDLIST_ABSOLUTE pMyPidl, PCUIDLIST_RELATIVE_ARRAY apidl, UINT cidl, BOOL bExtendedObject, IDataObject **dataObject)
static HRESULT CRegItemContextMenu_CreateInstance(PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, IContextMenu **ppcm)
Definition: CRegFolder.cpp:972
HRESULT CGuidItemExtractIcon_CreateInstance(LPCITEMIDLIST pidl, REFIID iid, LPVOID *ppvOut)
Definition: CRegFolder.cpp:141
const GUID IID_IDataObject
#define E_NOINTERFACE
Definition: winerror.h:2364

◆ Initialize()

HRESULT WINAPI CRegFolder::Initialize ( PREGFOLDERINITDATA  pInit,
LPCITEMIDLIST  pidlRoot 
)

Definition at line 390 of file CRegFolder.cpp.

391{
393 m_pOuterFolder = pInit->psfOuter;
394
395 m_pidlRoot.Attach(ILClone(pidlRoot));
396 if (!m_pidlRoot)
397 return E_OUTOFMEMORY;
398
399 return S_OK;
400}
PWDFDEVICE_INIT pInit
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
void InitializeFolderInfo(const REGFOLDERINFO *pInfo)
Definition: CRegFolder.cpp:100

◆ IsRequiredItem()

const REQUIREDREGITEM * CRegFolder::IsRequiredItem ( LPCITEMIDLIST  pidl) const
inline

Definition at line 339 of file CRegFolder.cpp.

340 {
341 const CLSID* const pCLSID = IsRegItem(pidl);
342 for (size_t i = 0; pCLSID && i < GetRequiredItemsCount(); ++i)
343 {
344 const REQUIREDREGITEM &item = GetAt(i);
345 if (item.clsid == *pCLSID)
346 return &item;
347 }
348 return NULL;
349 }
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static ATOM item
Definition: dde.c:856
const REQUIREDREGITEM & GetAt(size_t i) const
Definition: CRegFolder.cpp:138
UINT GetRequiredItemsCount() const
Definition: CRegFolder.cpp:137

Referenced by RegFolderContextMenuCallback().

◆ MapColumnToSCID()

HRESULT WINAPI CRegFolder::MapColumnToSCID ( UINT  column,
SHCOLUMNID pscid 
)
override

Implements IShellFolder2.

Definition at line 911 of file CRegFolder.cpp.

912{
913 switch (column)
914 {
915 case COL_NAME: return MakeSCID(*pscid, FMTID_Storage, PID_STG_NAME);
916 case COL_TYPE: return MakeSCID(*pscid, FMTID_Storage, PID_STG_STORAGETYPE);
917 case COL_INFOTIP: return MakeSCID(*pscid, FMTID_SummaryInformation, PIDSI_COMMENTS);
918 }
919 return E_INVALIDARG;
920}
#define PID_STG_STORAGETYPE
Definition: ntquery.h:50
#define PID_STG_NAME
Definition: ntquery.h:56
const FMTID FMTID_SummaryInformation
static HRESULT MakeSCID(SHCOLUMNID &scid, REFCLSID fmtid, UINT pid)
Definition: shfldr.h:99

◆ ParseDisplayName()

HRESULT WINAPI CRegFolder::ParseDisplayName ( HWND  hwndOwner,
LPBC  pbc,
LPOLESTR  lpszDisplayName,
ULONG pchEaten,
PIDLIST_RELATIVE ppidl,
ULONG pdwAttributes 
)
override

Implements IShellFolder.

Definition at line 435 of file CRegFolder.cpp.

437{
438 if (!ppidl)
439 return E_INVALIDARG;
440
441 *ppidl = NULL;
442
443 if (!lpszDisplayName)
444 return E_INVALIDARG;
445
446 if (lpszDisplayName[0] != L':' || lpszDisplayName[1] != L':')
447 {
448 FIXME("What should we do here?\n");
449 return E_FAIL;
450 }
451
452 LPWSTR pch, pchNextOfComma = NULL;
453 for (pch = &lpszDisplayName[2]; *pch && *pch != L'\\'; ++pch)
454 {
455 if (*pch == L',' && !pchNextOfComma)
456 pchNextOfComma = pch + 1;
457 }
458
459 CLSID clsid;
460 if (!GUIDFromStringW(&lpszDisplayName[2], &clsid))
461 return CO_E_CLASSSTRING;
462
463 if (pchNextOfComma)
464 {
465 FIXME("Delegate folder\n");
466 return E_FAIL;
467 }
468
469 CComHeapPtr<ITEMIDLIST> pidlTemp(CreateRegItem(GetPidlType(), clsid));
470 if (!pidlTemp)
471 return E_OUTOFMEMORY;
472
473 if (!_IsInNameSpace(pidlTemp) && !(BindCtx_GetMode(pbc, 0) & STGM_CREATE))
474 return E_INVALIDARG;
475
476 *ppidl = pidlTemp.Detach();
477
478 if (!*pch)
479 {
480 if (pdwAttributes && *pdwAttributes)
481 GetGuidItemAttributes(*ppidl, pdwAttributes);
482
483 return S_OK;
484 }
485
486 HRESULT hr = SHELL32_ParseNextElement(this, hwndOwner, pbc, ppidl, pch + 1, pchEaten,
487 pdwAttributes);
488 if (FAILED(hr))
489 {
490 ILFree(*ppidl);
491 *ppidl = NULL;
492 }
493 return hr;
494}
static LPITEMIDLIST CreateRegItem(PIDLTYPE type, REFCLSID clsid, int order=-1)
Definition: CRegFolder.cpp:70
BOOL _IsInNameSpace(_In_ LPCITEMIDLIST pidl)
Definition: CRegFolder.cpp:424
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:278
#define FAILED(hr)
Definition: intsafe.h:51
#define pch(ap)
Definition: match.c:418
#define STGM_CREATE
Definition: objbase.h:926
BOOL WINAPI GUIDFromStringW(_In_ PCWSTR psz, _Out_ LPGUID pguid)
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1044
HRESULT SHELL32_ParseNextElement(IShellFolder2 *psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST *pidlInOut, LPOLESTR szNext, DWORD *pEaten, DWORD *pdwAttributes)
Definition: shlfolder.cpp:204
#define CO_E_CLASSSTRING
Definition: winerror.h:2806

◆ SetNameOf()

HRESULT WINAPI CRegFolder::SetNameOf ( HWND  hwndOwner,
PCUITEMID_CHILD  pidl,
LPCOLESTR  lpName,
DWORD  dwFlags,
PITEMID_CHILD pPidlOut 
)
override

Implements IShellFolder.

Definition at line 787 of file CRegFolder.cpp.

789{
790 GUID const *clsid = IsRegItem(pidl);
791 WCHAR szName[100];
792
793 if (!lpName || (*lpName && IsIllegalFsFileName(lpName))) // Note: Must allow empty name
794 return E_INVALIDARG;
795
796 if (!clsid)
797 {
798 ERR("Pidl is not reg item!\n");
799 return E_FAIL;
800 }
801 FormatGUIDKey(szName, _countof(szName), L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\%s", clsid);
802
803 BOOL bEmpty = StrIsNullOrEmpty(lpName); // Empty resets to the default name
804 DWORD cbData = (wcslen(lpName) + 1) * sizeof(WCHAR);
807
808 if (res == ERROR_SUCCESS)
809 {
810 HRESULT hr = pPidlOut ? SHILClone(pidl, pPidlOut) : S_OK; // Copy the PIDL before SHChangeNotify
811 PIDLIST_ABSOLUTE pidlAbs;
813 {
815 ILFree(pidlAbs);
816 }
817 return hr;
818 }
819 return E_FAIL;
820}
HRESULT FormatGUIDKey(LPWSTR KeyName, SIZE_T KeySize, LPCWSTR RegPath, const GUID *riid)
Definition: CRegFolder.cpp:31
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
#define RRF_RT_REG_SZ
Definition: driver.c:575
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:133
DWORD WINAPI SHDeleteValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue)
Definition: reg.c:1762
DWORD WINAPI SHSetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, DWORD dwType, LPCVOID pvData, DWORD cbData)
Definition: reg.c:1306
static const WCHAR szName[]
Definition: powrprof.c:45
HRESULT SHELL_CreateAbsolutePidl(IShellFolder *pSF, PCUIDLIST_RELATIVE pidlChild, PIDLIST_ABSOLUTE *ppPidl)
Definition: shlfolder.cpp:142
static BOOL IsIllegalFsFileName(PCWSTR Name)
Definition: shfldr.h:178
#define SHCNE_UPDATEITEM
Definition: shlobj.h:1911
#define SHCNF_IDLIST
Definition: shlobj.h:1929
#define _countof(array)
Definition: sndvol32.h:70
_In_ LPCSTR lpName
Definition: winbase.h:2821
#define HKEY_CURRENT_USER
Definition: winreg.h:11

Member Data Documentation

◆ m_pidlRoot

CComHeapPtr<ITEMIDLIST> CRegFolder::m_pidlRoot
private

Definition at line 328 of file CRegFolder.cpp.

Referenced by BindToObject(), GetGuidItemAttributes(), GetUIObjectOf(), and Initialize().

◆ m_pOuterFolder

IShellFolder* CRegFolder::m_pOuterFolder
private

Definition at line 327 of file CRegFolder.cpp.

Referenced by EnumObjects(), Initialize(), and SetNameOf().


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