ReactOS 0.4.15-dev-8434-g155a7c7
CRegFolder Class Reference
Inheritance diagram for CRegFolder:
Collaboration diagram for CRegFolder:

Public Member Functions

 CRegFolder ()
 
 ~CRegFolder ()
 
HRESULT WINAPI Initialize (const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName)
 
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 ()
 

Private Member Functions

HRESULT GetGuidItemAttributes (LPCITEMIDLIST pidl, LPDWORD pdwAttributes)
 
BOOL _IsInNameSpace (_In_ LPCITEMIDLIST pidl)
 

Private Attributes

GUID m_guid
 
CAtlStringW m_rootPath
 
CAtlStringW m_enumKeyName
 
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
 

Detailed Description

Definition at line 302 of file CRegFolder.cpp.

Constructor & Destructor Documentation

◆ CRegFolder()

CRegFolder::CRegFolder ( )

Definition at line 351 of file CRegFolder.cpp.

352{
353}

◆ ~CRegFolder()

CRegFolder::~CRegFolder ( )

Definition at line 355 of file CRegFolder.cpp.

356{
357}

Member Function Documentation

◆ _IsInNameSpace()

BOOL CRegFolder::_IsInNameSpace ( _In_ LPCITEMIDLIST  pidl)
private

Definition at line 400 of file CRegFolder.cpp.

401{
403 if (IsEqualGUID(clsid, CLSID_Printers))
404 return TRUE;
405 if (IsEqualGUID(clsid, CLSID_ConnectionFolder))
406 return TRUE;
407 FIXME("Check registry\n");
408 return TRUE;
409}
#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:2292
#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 477 of file CRegFolder.cpp.

478{
479 CComPtr<IPersistFolder> pFolder;
480 HRESULT hr;
481
482 if (!ppvOut || !pidl || !pidl->mkid.cb)
483 return E_INVALIDARG;
484
485 *ppvOut = NULL;
486
487 GUID *pGUID = _ILGetGUIDPointer(pidl);
488 if (!pGUID)
489 {
490 ERR("CRegFolder::BindToObject called for non guid item!\n");
491 return E_INVALIDARG;
492 }
493
494 hr = SHELL32_BindToSF(m_pidlRoot, NULL, pidl, pGUID, riid, ppvOut);
496 return hr;
497
498 return S_OK;
499}
#define ERR(fmt,...)
Definition: precomp.h:57
CComHeapPtr< ITEMIDLIST > m_pidlRoot
Definition: CRegFolder.cpp:310
#define E_INVALIDARG
Definition: ddrawi.h:101
#define NULL
Definition: types.h:112
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
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:168
HRESULT hr
Definition: shlfolder.c:183

◆ BindToStorage()

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

Definition at line 501 of file CRegFolder.cpp.

502{
503 return E_NOTIMPL;
504}
#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 506 of file CRegFolder.cpp.

507{
508 if (!pidl1 || !pidl2 || pidl1->mkid.cb == 0 || pidl2->mkid.cb == 0)
509 {
510 ERR("Got an empty pidl!\n");
511 return E_INVALIDARG;
512 }
513
514 GUID const *clsid1 = _ILGetGUIDPointer (pidl1);
515 GUID const *clsid2 = _ILGetGUIDPointer (pidl2);
516
517 if (!clsid1 && !clsid2)
518 {
519 ERR("Got no guid pidl!\n");
520 return E_INVALIDARG;
521 }
522 else if (clsid1 && clsid2)
523 {
524 if (memcmp(clsid1, clsid2, sizeof(GUID)) == 0)
525 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
526
527 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
528 }
529
530 /* Guid folders come first compared to everything else */
531 /* And Drives come before folders in My Computer */
533 {
534 return MAKE_COMPARE_HRESULT(clsid1 ? 1 : -1);
535 }
536 else
537 {
538 return MAKE_COMPARE_HRESULT(clsid1 ? -1 : 1);
539 }
540}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
LPARAM lParam
Definition: combotst.c:139
BOOL _ILIsMyComputer(LPCITEMIDLIST pidl)
Definition: pidl.c:1970
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:610
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:224
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:247

◆ CreateViewObject()

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

Definition at line 542 of file CRegFolder.cpp.

543{
544 return E_NOTIMPL;
545}

◆ EnumObjects()

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

Definition at line 472 of file CRegFolder.cpp.

473{
474 return ShellObjectCreatorInit<CRegFolderEnum>(m_enumKeyName, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
475}
CAtlStringW m_enumKeyName
Definition: CRegFolder.cpp:309
_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 787 of file CRegFolder.cpp.

788{
789 return E_NOTIMPL;
790}

◆ GetAttributesOf()

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

Definition at line 547 of file CRegFolder.cpp.

548{
549 if (!rgfInOut || !cidl || !apidl)
550 return E_INVALIDARG;
551
552 if (*rgfInOut == 0)
553 *rgfInOut = ~0;
554
555 while(cidl > 0 && *apidl)
556 {
557 if (_ILIsSpecialFolder(*apidl))
558 GetGuidItemAttributes(*apidl, rgfInOut);
559 else
560 ERR("Got unknown pidl\n");
561 apidl++;
562 cidl--;
563 }
564
565 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
566 *rgfInOut &= ~SFGAO_VALIDATE;
567
568 return S_OK;
569}
HRESULT GetGuidItemAttributes(LPCITEMIDLIST pidl, LPDWORD pdwAttributes)
Definition: CRegFolder.cpp:378
static BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)

◆ GetDefaultColumn()

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

Implements IShellFolder2.

Definition at line 792 of file CRegFolder.cpp.

793{
794 if (pSort)
795 *pSort = 0;
796 if (pDisplay)
797 *pDisplay = 0;
798
799 return S_OK;
800}

◆ GetDefaultColumnState()

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

Implements IShellFolder2.

Definition at line 802 of file CRegFolder.cpp.

803{
804 if (iColumn >= REGFOLDERCOLUMNCOUNT)
805 return E_INVALIDARG;
807 return S_OK;
808}
@ REGFOLDERCOLUMNCOUNT
Definition: CRegFolder.cpp:299
@ 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 782 of file CRegFolder.cpp.

783{
784 return E_NOTIMPL;
785}

◆ GetDetailsEx()

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

Implements IShellFolder2.

Definition at line 810 of file CRegFolder.cpp.

811{
812 return E_NOTIMPL;
813}

◆ GetDetailsOf()

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

Implements IShellFolder2.

Definition at line 815 of file CRegFolder.cpp.

816{
817 if (!psd)
818 return E_INVALIDARG;
819
820 if (!pidl)
821 {
822 TRACE("CRegFolder has no column info\n");
823 return E_INVALIDARG;
824 }
825
826 GUID const *clsid = _ILGetGUIDPointer (pidl);
827
828 if (!clsid)
829 {
830 ERR("Pidl is not reg item!\n");
831 return E_INVALIDARG;
832 }
833
834 switch(iColumn)
835 {
836 case COL_NAME:
837 return GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
838 case COL_TYPE:
839 return SHSetStrRet(&psd->str, IDS_SYSTEMFOLDER);
840 case COL_INFOTIP:
841 HKEY hKey;
843 return SHSetStrRet(&psd->str, "");
844
845 psd->str.cStr[0] = 0x00;
846 psd->str.uType = STRRET_CSTR;
847 RegLoadMUIStringA(hKey, "InfoTip", psd->str.cStr, MAX_PATH, NULL, 0, NULL);
849 return S_OK;
850 default:
851 /* Return an empty string when we area asked for a column we don't support.
852 Only the regfolder is supposed to do this as it supports less columns compared to other folder
853 and its contents are supposed to be presented alongside items that support more columns. */
854 return SHSetStrRet(&psd->str, "");
855 }
856 return E_FAIL;
857}
@ COL_INFOTIP
Definition: CRegFolder.cpp:298
@ COL_NAME
Definition: CRegFolder.cpp:296
@ COL_TYPE
Definition: CRegFolder.cpp:297
#define RegCloseKey(hKey)
Definition: registry.h:49
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CRegFolder.cpp:610
#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:236
#define IDS_SYSTEMFOLDER
Definition: shresdef.h:355
@ 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 610 of file CRegFolder.cpp.

611{
612 if (!strRet || (!_ILIsSpecialFolder(pidl) && pidl != NULL))
613 return E_INVALIDARG;
614
615 if (!pidl || !pidl->mkid.cb)
616 {
618 {
620 {
621 TRACE("GDNO returning INFOLDER instead of %#x\n", GET_SHGDN_RELATION(dwFlags));
622 }
623 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc((2 + 38 + 1) * sizeof(WCHAR));
624 if (!pszPath)
625 return E_OUTOFMEMORY;
626 /* parsing name like ::{...} */
627 pszPath[0] = ':';
628 pszPath[1] = ':';
629 SHELL32_GUIDToStringW(m_guid, &pszPath[2]);
630 strRet->uType = STRRET_WSTR;
631 strRet->pOleStr = pszPath;
632 return S_OK;
633 }
634 else
635 {
636 BOOL bRet;
637 WCHAR wstrName[MAX_PATH+1];
638 bRet = HCR_GetClassNameW(m_guid, wstrName, MAX_PATH);
639 if (!bRet)
640 return E_FAIL;
641
642 return SHSetStrRet(strRet, wstrName);
643 }
644 }
645
646 HRESULT hr;
647 GUID const *clsid = _ILGetGUIDPointer (pidl);
648
649 /* First of all check if we need to query the name from the child item */
652 {
653 int bWantsForParsing = FALSE;
654
655 /*
656 * We can only get a filesystem path from a shellfolder if the
657 * value WantsFORPARSING in CLSID\\{...}\\shellfolder exists.
658 *
659 * Exception: The MyComputer folder doesn't have this key,
660 * but any other filesystem backed folder it needs it.
661 */
662 if (IsEqualIID (*clsid, CLSID_MyComputer))
663 {
664 bWantsForParsing = TRUE;
665 }
666 else
667 {
668 HKEY hkeyClass;
669 if (HCR_RegOpenClassIDKey(*clsid, &hkeyClass))
670 {
671 LONG res = SHGetValueW(hkeyClass, L"Shellfolder", L"WantsForParsing", NULL, NULL, NULL);
672 bWantsForParsing = (res == ERROR_SUCCESS);
673 RegCloseKey(hkeyClass);
674 }
675 }
676
677 if (bWantsForParsing)
678 {
679 /*
680 * we need the filesystem path to the destination folder.
681 * Only the folder itself can know it
682 */
683 return SHELL32_GetDisplayNameOfChild (this, pidl, dwFlags, strRet);
684 }
685 }
686
687 /* Allocate the buffer for the result */
688 SIZE_T cchPath = MAX_PATH + 1;
689 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc(cchPath * sizeof(WCHAR));
690 if (!pszPath)
691 return E_OUTOFMEMORY;
692
693 hr = S_OK;
694
696 {
697 SIZE_T pathlen = 0;
698 PWCHAR pItemName = pszPath; // GET_SHGDN_RELATION(dwFlags) == SHGDN_INFOLDER
700 {
701 hr = StringCchCopyW(pszPath, cchPath, m_rootPath);
702 if (SUCCEEDED(hr))
703 {
704 pathlen = wcslen(pszPath);
705 pItemName = &pszPath[pathlen];
706 if (pathlen)
707 {
708 if (++pathlen < cchPath)
709 *pItemName++ = L'\\';
710 else
712 }
713 }
714 }
715
716 if (SUCCEEDED(hr) && pathlen + 2 + 38 + 1 < cchPath)
717 {
718 /* parsing name like ::{...} */
719 pItemName[0] = L':';
720 pItemName[1] = L':';
721 SHELL32_GUIDToStringW(*clsid, &pItemName[2]);
722 }
723 else
724 {
726 }
727 }
728 else
729 {
730 /* user friendly name */
731 if (!HCR_GetClassNameW(*clsid, pszPath, cchPath))
732 hr = E_FAIL;
733 }
734
735 if (SUCCEEDED(hr))
736 {
737 strRet->uType = STRRET_WSTR;
738 strRet->pOleStr = pszPath;
739 }
740 else
741 {
742 CoTaskMemFree(pszPath);
743 }
744
745 return hr;
746}
CAtlStringW m_rootPath
Definition: CRegFolder.cpp:308
#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 SUCCEEDED(hr)
Definition: intsafe.h:50
#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:405
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:206
#define IS_SHGDN_FOR_PARSING(flags)
Definition: shfldr.h:52
static __inline int SHELL32_GUIDToStringW(REFGUID guid, LPWSTR str)
Definition: shfldr.h:101
@ STRRET_WSTR
Definition: shtypes.idl:85
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
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 378 of file CRegFolder.cpp.

379{
380 DWORD dwAttributes = *pdwAttributes;
381
382 /* First try to get them from the registry */
383 if (!HCR_GetFolderAttributes(pidl, pdwAttributes))
384 {
385 /* We couldn't get anything */
386 *pdwAttributes = 0;
387 }
388
389 /* Items have more attributes when on desktop */
391 {
392 *pdwAttributes |= (dwAttributes & (SFGAO_CANLINK|SFGAO_CANDELETE|SFGAO_CANRENAME|SFGAO_HASPROPSHEET));
393 }
394
395 /* In any case, links can be created */
396 *pdwAttributes |= (dwAttributes & SFGAO_CANLINK);
397 return S_OK;
398}
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:573
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 571 of file CRegFolder.cpp.

573{
574 LPVOID pObj = NULL;
576
577 if (!ppvOut)
578 return hr;
579
580 *ppvOut = NULL;
581
582 if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
583 {
584 hr = CGuidItemExtractIcon_CreateInstance(apidl[0], riid, &pObj);
585 }
586 else if (IsEqualIID (riid, IID_IContextMenu) && (cidl >= 1))
587 {
588 if (!_ILGetGUIDPointer (apidl[0]))
589 {
590 ERR("Got non guid item!\n");
591 return E_FAIL;
592 }
593
594 hr = CGuidItemContextMenu_CreateInstance(m_pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), (IContextMenu**)&pObj);
595 }
596 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
597 {
598 hr = IDataObject_Constructor (hwndOwner, m_pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
599 }
600 else
601 {
603 }
604
605 *ppvOut = pObj;
606 return hr;
607
608}
HRESULT IDataObject_Constructor(HWND hwndOwner, PCIDLIST_ABSOLUTE pMyPidl, PCUIDLIST_RELATIVE_ARRAY apidl, UINT cidl, BOOL bExtendedObject, IDataObject **dataObject)
HRESULT CGuidItemExtractIcon_CreateInstance(LPCITEMIDLIST pidl, REFIID iid, LPVOID *ppvOut)
Definition: CRegFolder.cpp:130
HRESULT CGuidItemContextMenu_CreateInstance(PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, IContextMenu **ppcm)
Definition: CRegFolder.cpp:87
const GUID IID_IDataObject
#define E_NOINTERFACE
Definition: winerror.h:2364

◆ Initialize()

HRESULT WINAPI CRegFolder::Initialize ( const GUID pGuid,
LPCITEMIDLIST  pidlRoot,
LPCWSTR  lpszPath,
LPCWSTR  lpszEnumKeyName 
)

Definition at line 359 of file CRegFolder.cpp.

360{
361 memcpy(&m_guid, pGuid, sizeof(m_guid));
362
363 m_rootPath = lpszPath;
364 if (!m_rootPath)
365 return E_OUTOFMEMORY;
366
367 m_enumKeyName = lpszEnumKeyName;
368 if (!m_enumKeyName)
369 return E_OUTOFMEMORY;
370
371 m_pidlRoot.Attach(ILClone(pidlRoot));
372 if (!m_pidlRoot)
373 return E_OUTOFMEMORY;
374
375 return S_OK;
376}
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237

◆ MapColumnToSCID()

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

Implements IShellFolder2.

Definition at line 859 of file CRegFolder.cpp.

860{
861 return E_NOTIMPL;
862}

◆ ParseDisplayName()

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

Implements IShellFolder.

Definition at line 411 of file CRegFolder.cpp.

413{
414 if (!ppidl)
415 return E_INVALIDARG;
416
417 *ppidl = NULL;
418
419 if (!lpszDisplayName)
420 return E_INVALIDARG;
421
422 if (lpszDisplayName[0] != L':' || lpszDisplayName[1] != L':')
423 {
424 FIXME("What should we do here?\n");
425 return E_FAIL;
426 }
427
428 LPWSTR pch, pchNextOfComma = NULL;
429 for (pch = &lpszDisplayName[2]; *pch && *pch != L'\\'; ++pch)
430 {
431 if (*pch == L',' && !pchNextOfComma)
432 pchNextOfComma = pch + 1;
433 }
434
435 CLSID clsid;
436 if (!GUIDFromStringW(&lpszDisplayName[2], &clsid))
437 return CO_E_CLASSSTRING;
438
439 if (pchNextOfComma)
440 {
441 FIXME("Delegate folder\n");
442 return E_FAIL;
443 }
444
445 CComHeapPtr<ITEMIDLIST> pidlTemp(_ILCreateGuid(PT_GUID, clsid));
446 if (!pidlTemp)
447 return E_OUTOFMEMORY;
448
449 if (!_IsInNameSpace(pidlTemp) && !(BindCtx_GetMode(pbc, 0) & STGM_CREATE))
450 return E_INVALIDARG;
451
452 *ppidl = pidlTemp.Detach();
453
454 if (!*pch)
455 {
456 if (pdwAttributes && *pdwAttributes)
457 GetGuidItemAttributes(*ppidl, pdwAttributes);
458
459 return S_OK;
460 }
461
462 HRESULT hr = SHELL32_ParseNextElement(this, hwndOwner, pbc, ppidl, pch + 1, pchEaten,
463 pdwAttributes);
464 if (FAILED(hr))
465 {
466 ILFree(*ppidl);
467 *ppidl = NULL;
468 }
469 return hr;
470}
BOOL _IsInNameSpace(_In_ LPCITEMIDLIST pidl)
Definition: CRegFolder.cpp:400
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:128
#define PT_GUID
#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:940
LPITEMIDLIST _ILCreateGuid(PIDLTYPE type, REFIID guid)
Definition: pidl.c:1728
HRESULT SHELL32_ParseNextElement(IShellFolder2 *psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST *pidlInOut, LPOLESTR szNext, DWORD *pEaten, DWORD *pdwAttributes)
Definition: shlfolder.cpp:79
#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 748 of file CRegFolder.cpp.

750{
751 GUID const *clsid = _ILGetGUIDPointer (pidl);
752 LPOLESTR pStr;
753 HRESULT hr;
754 WCHAR szName[100];
755
756 if (!clsid)
757 {
758 ERR("Pidl is not reg item!\n");
759 return E_FAIL;
760 }
761
762 hr = StringFromCLSID(*clsid, &pStr);
764 return hr;
765
766 swprintf(szName, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\%s", pStr);
767
768 DWORD cbData = (wcslen(lpName) + 1) * sizeof(WCHAR);
770
771 CoTaskMemFree(pStr);
772
773 if (res == ERROR_SUCCESS)
774 {
775 return pPidlOut ? SHILClone(pidl, pPidlOut) : S_OK;
776 }
777
778 return E_FAIL;
779}
HRESULT WINAPI StringFromCLSID(REFCLSID id, LPOLESTR *idstr)
Definition: compobj.c:2412
#define RRF_RT_REG_SZ
Definition: driver.c:575
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:13
DWORD WINAPI SHSetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, DWORD dwType, LPCVOID pvData, DWORD cbData)
Definition: reg.c:1306
#define swprintf
Definition: precomp.h:40
static LPOLESTR
Definition: stg_prop.c:27
static const WCHAR szName[]
Definition: powrprof.c:45
_In_ LPCSTR lpName
Definition: winbase.h:2789
#define HKEY_CURRENT_USER
Definition: winreg.h:11

Member Data Documentation

◆ m_enumKeyName

CAtlStringW CRegFolder::m_enumKeyName
private

Definition at line 309 of file CRegFolder.cpp.

Referenced by EnumObjects(), and Initialize().

◆ m_guid

GUID CRegFolder::m_guid
private

Definition at line 307 of file CRegFolder.cpp.

Referenced by GetDisplayNameOf(), and Initialize().

◆ m_pidlRoot

CComHeapPtr<ITEMIDLIST> CRegFolder::m_pidlRoot
private

◆ m_rootPath

CAtlStringW CRegFolder::m_rootPath
private

Definition at line 308 of file CRegFolder.cpp.

Referenced by GetDisplayNameOf(), and Initialize().


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