2 * Virtual Workplace folder
4 * Copyright 1997 Marcus Meissner
5 * Copyright 1998, 1999, 2002 Juergen Schmied
6 * Copyright 2009 Andrew Hill
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 WINE_DEFAULT_DEBUG_CHANNEL (shell
);
28 CDrivesFolder should create a CRegFolder to represent the virtual items that exist only in
29 the registry. The CRegFolder is aggregated by the CDrivesFolder.
30 The CDrivesFolderEnum class should enumerate only drives on the system. Since the CRegFolder
31 implementation of IShellFolder::EnumObjects enumerates the virtual items, the
32 CDrivesFolderEnum is only responsible for returning the physical items.
34 2. At least on my XP system, the drive pidls returned are of type PT_DRIVE1, not PT_DRIVE
35 3. The parsing name returned for my computer is incorrect. It should be "My Computer"
38 /***********************************************************************
39 * IShellFolder implementation
42 class CDrivesFolderEnum
:
43 public CEnumIDListBase
48 HRESULT WINAPI
Initialize(HWND hwndOwner
, DWORD dwFlags
);
49 BOOL
CreateMyCompEnumList(DWORD dwFlags
);
51 BEGIN_COM_MAP(CDrivesFolderEnum
)
52 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList
, IEnumIDList
)
56 /***********************************************************************
57 * IShellFolder [MyComputer] implementation
60 static const shvheader MyComputerSFHeader
[] = {
61 {IDS_SHV_COLUMN1
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15},
62 {IDS_SHV_COLUMN3
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 10},
63 {IDS_SHV_COLUMN6
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 10},
64 {IDS_SHV_COLUMN7
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 10},
67 #define MYCOMPUTERSHELLVIEWCOLUMNS 4
69 CDrivesFolderEnum::CDrivesFolderEnum()
73 CDrivesFolderEnum::~CDrivesFolderEnum()
77 HRESULT WINAPI
CDrivesFolderEnum::Initialize(HWND hwndOwner
, DWORD dwFlags
)
79 if (CreateMyCompEnumList(dwFlags
) == FALSE
)
85 /**************************************************************************
86 * CDrivesFolderEnum::CreateMyCompEnumList()
89 BOOL
CDrivesFolderEnum::CreateMyCompEnumList(DWORD dwFlags
)
92 static const WCHAR MyComputer_NameSpaceW
[] = L
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\Namespace";
94 TRACE("(%p)->(flags=0x%08x)\n", this, dwFlags
);
96 /* enumerate the folders */
97 if (dwFlags
& SHCONTF_FOLDERS
)
99 WCHAR wszDriveName
[] = {'A', ':', '\\', '\0'};
100 DWORD dwDrivemap
= GetLogicalDrives();
104 while (bRet
&& wszDriveName
[0] <= 'Z')
106 if(dwDrivemap
& 0x00000001L
)
107 bRet
= AddToEnumList(_ILCreateDrive(wszDriveName
));
109 dwDrivemap
= dwDrivemap
>> 1;
112 TRACE("-- (%p)-> enumerate (mycomputer shell extensions)\n", this);
113 for (i
= 0; i
< 2; i
++)
115 if (bRet
&& ERROR_SUCCESS
== RegOpenKeyExW(i
== 0 ? HKEY_LOCAL_MACHINE
: HKEY_CURRENT_USER
,
116 MyComputer_NameSpaceW
, 0, KEY_READ
, &hKey
))
125 dwSize
= sizeof(wszBuf
) / sizeof(wszBuf
[0]);
126 ErrorCode
= RegEnumKeyExW(hKey
, j
, wszBuf
, &dwSize
, 0, NULL
, NULL
, NULL
);
127 if (ERROR_SUCCESS
== ErrorCode
)
129 if (wszBuf
[0] != L
'{')
131 dwSize
= sizeof(wszBuf
);
132 RegGetValueW(hKey
, wszBuf
, NULL
, RRF_RT_REG_SZ
, NULL
, wszBuf
, &dwSize
);
135 /* FIXME: shell extensions - the type should be PT_SHELLEXT (tested) */
136 pidl
= _ILCreateGuidFromStrW(wszBuf
);
138 bRet
= AddToEnumList(pidl
);
140 ERR("Invalid MyComputer namespace extesion: %s\n", wszBuf
);
143 else if (ERROR_NO_MORE_ITEMS
== ErrorCode
)
155 CDrivesFolder::CDrivesFolder()
161 CDrivesFolder::~CDrivesFolder()
163 TRACE ("-- destroying IShellFolder(%p)\n", this);
167 HRESULT WINAPI
CDrivesFolder::FinalConstruct()
170 WCHAR szName
[MAX_PATH
];
171 WCHAR wszMyCompKey
[256];
174 pidlRoot
= _ILCreateMyComputer(); /* my qualified pidl */
175 if (pidlRoot
== NULL
)
176 return E_OUTOFMEMORY
;
178 i
= swprintf(wszMyCompKey
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\");
179 StringFromGUID2(CLSID_MyComputer
, wszMyCompKey
+ i
, sizeof(wszMyCompKey
) / sizeof(wszMyCompKey
[0]) - i
);
180 dwSize
= sizeof(szName
);
181 if (RegGetValueW(HKEY_CURRENT_USER
, wszMyCompKey
,
182 NULL
, RRF_RT_REG_SZ
, NULL
, szName
, &dwSize
) == ERROR_SUCCESS
)
184 sName
= (LPWSTR
)SHAlloc((wcslen(szName
) + 1) * sizeof(WCHAR
));
186 wcscpy(sName
, szName
);
187 TRACE("sName %s\n", debugstr_w(sName
));
192 /**************************************************************************
193 * CDrivesFolder::ParseDisplayName
195 HRESULT WINAPI
CDrivesFolder::ParseDisplayName(HWND hwndOwner
, LPBC pbc
, LPOLESTR lpszDisplayName
,
196 DWORD
* pchEaten
, PIDLIST_RELATIVE
* ppidl
, DWORD
* pdwAttributes
)
198 HRESULT hr
= E_INVALIDARG
;
199 LPCWSTR szNext
= NULL
;
200 WCHAR szElement
[MAX_PATH
];
201 LPITEMIDLIST pidlTemp
= NULL
;
204 TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", this,
205 hwndOwner
, pbc
, lpszDisplayName
, debugstr_w (lpszDisplayName
),
206 pchEaten
, ppidl
, pdwAttributes
);
210 *pchEaten
= 0; /* strange but like the original */
212 /* handle CLSID paths */
213 if (lpszDisplayName
[0] == ':' && lpszDisplayName
[1] == ':')
215 szNext
= GetNextElementW (lpszDisplayName
, szElement
, MAX_PATH
);
216 TRACE ("-- element: %s\n", debugstr_w (szElement
));
217 CLSIDFromString (szElement
+ 2, &clsid
);
218 pidlTemp
= _ILCreateGuid (PT_GUID
, clsid
);
220 /* do we have an absolute path name ? */
221 else if (PathGetDriveNumberW (lpszDisplayName
) >= 0 &&
222 lpszDisplayName
[2] == (WCHAR
) '\\')
224 szNext
= GetNextElementW (lpszDisplayName
, szElement
, MAX_PATH
);
225 /* make drive letter uppercase to enable PIDL comparison */
226 szElement
[0] = toupper(szElement
[0]);
227 pidlTemp
= _ILCreateDrive (szElement
);
230 if (szNext
&& *szNext
)
232 hr
= SHELL32_ParseNextElement (this, hwndOwner
, pbc
, &pidlTemp
,
233 (LPOLESTR
) szNext
, pchEaten
, pdwAttributes
);
237 if (pdwAttributes
&& *pdwAttributes
)
238 SHELL32_GetItemAttributes (this,
239 pidlTemp
, pdwAttributes
);
245 TRACE ("(%p)->(-- ret=0x%08x)\n", this, hr
);
250 /**************************************************************************
251 * CDrivesFolder::EnumObjects
253 HRESULT WINAPI
CDrivesFolder::EnumObjects(HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
)
255 return ShellObjectCreatorInit
<CDrivesFolderEnum
>(hwndOwner
, dwFlags
, IID_IEnumIDList
, ppEnumIDList
);
258 /**************************************************************************
259 * CDrivesFolder::BindToObject
261 HRESULT WINAPI
CDrivesFolder::BindToObject(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
263 TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this,
264 pidl
, pbcReserved
, shdebugstr_guid(&riid
), ppvOut
);
266 return SHELL32_BindToChild(pidlRoot
, NULL
, pidl
, riid
, ppvOut
);
269 /**************************************************************************
270 * CDrivesFolder::BindToStorage
272 HRESULT WINAPI
CDrivesFolder::BindToStorage(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
274 FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this,
275 pidl
, pbcReserved
, shdebugstr_guid (&riid
), ppvOut
);
281 /**************************************************************************
282 * CDrivesFolder::CompareIDs
285 HRESULT WINAPI
CDrivesFolder::CompareIDs(LPARAM lParam
, PCUIDLIST_RELATIVE pidl1
, PCUIDLIST_RELATIVE pidl2
)
289 TRACE("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", this, lParam
, pidl1
, pidl2
);
290 nReturn
= SHELL32_CompareIDs (this, lParam
, pidl1
, pidl2
);
291 TRACE("-- %i\n", nReturn
);
295 /**************************************************************************
296 * CDrivesFolder::CreateViewObject
298 HRESULT WINAPI
CDrivesFolder::CreateViewObject(HWND hwndOwner
, REFIID riid
, LPVOID
* ppvOut
)
300 CComPtr
<IShellView
> pShellView
;
301 HRESULT hr
= E_INVALIDARG
;
303 TRACE("(%p)->(hwnd=%p,%s,%p)\n", this,
304 hwndOwner
, shdebugstr_guid (&riid
), ppvOut
);
311 if (IsEqualIID(riid
, IID_IDropTarget
))
313 WARN("IDropTarget not implemented\n");
316 else if (IsEqualIID(riid
, IID_IContextMenu
))
318 WARN("IContextMenu not implemented\n");
321 else if (IsEqualIID(riid
, IID_IShellView
))
323 hr
= IShellView_Constructor ((IShellFolder
*)this, &pShellView
);
326 hr
= pShellView
->QueryInterface(riid
, ppvOut
);
329 TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut
);
333 static BOOL
_ILIsControlPanel(LPCITEMIDLIST pidl
)
335 GUID
*guid
= _ILGetGUIDPointer(pidl
);
337 TRACE("(%p)\n", pidl
);
340 return IsEqualIID(*guid
, CLSID_ControlPanel
);
344 /**************************************************************************
345 * CDrivesFolder::GetAttributesOf
347 HRESULT WINAPI
CDrivesFolder::GetAttributesOf(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
* rgfInOut
)
349 static const DWORD dwComputerAttributes
=
350 SFGAO_CANRENAME
| SFGAO_CANDELETE
| SFGAO_HASPROPSHEET
| SFGAO_DROPTARGET
|
351 SFGAO_FILESYSANCESTOR
| SFGAO_FOLDER
| SFGAO_HASSUBFOLDER
| SFGAO_CANLINK
;
352 static const DWORD dwControlPanelAttributes
=
353 SFGAO_HASSUBFOLDER
| SFGAO_FOLDER
| SFGAO_CANLINK
;
354 static const DWORD dwDriveAttributes
=
355 SFGAO_HASSUBFOLDER
| SFGAO_FILESYSTEM
| SFGAO_FOLDER
| SFGAO_FILESYSANCESTOR
|
356 SFGAO_DROPTARGET
| SFGAO_HASPROPSHEET
| SFGAO_CANRENAME
| SFGAO_CANLINK
;
358 TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
359 this, cidl
, apidl
, rgfInOut
, rgfInOut
? *rgfInOut
: 0);
367 /* FIXME: always add SFGAO_CANLINK */
369 *rgfInOut
&= dwComputerAttributes
;
372 for (UINT i
= 0; i
< cidl
; ++i
)
374 if (_ILIsDrive(apidl
[i
]))
375 *rgfInOut
&= dwDriveAttributes
;
376 else if (_ILIsControlPanel(apidl
[i
]))
377 *rgfInOut
&= dwControlPanelAttributes
;
378 else if (_ILIsSpecialFolder(*apidl
))
379 SHELL32_GetItemAttributes(this, apidl
[i
], rgfInOut
);
381 ERR("Got unknown pidl type!\n");
385 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
386 *rgfInOut
&= ~SFGAO_VALIDATE
;
388 TRACE ("-- result=0x%08x\n", *rgfInOut
);
392 /**************************************************************************
393 * CDrivesFolder::GetUIObjectOf
396 * hwndOwner [in] Parent window for any output
397 * cidl [in] array size
398 * apidl [in] simple pidl array
399 * riid [in] Requested Interface
400 * prgfInOut [ ] reserved
401 * ppvObject [out] Resulting Interface
404 HRESULT WINAPI
CDrivesFolder::GetUIObjectOf(HWND hwndOwner
,
405 UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
,
406 REFIID riid
, UINT
*prgfInOut
, LPVOID
*ppvOut
)
409 IUnknown
*pObj
= NULL
;
410 HRESULT hr
= E_INVALIDARG
;
412 TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", this,
413 hwndOwner
, cidl
, apidl
, shdebugstr_guid (&riid
), prgfInOut
, ppvOut
);
420 if (IsEqualIID (riid
, IID_IContextMenu
) && (cidl
>= 1))
422 hr
= CDefFolderMenu_Create2(pidlRoot
, hwndOwner
, cidl
, apidl
, (IShellFolder
*)this, NULL
, 0, NULL
, (IContextMenu
**)&pObj
);
424 else if (IsEqualIID (riid
, IID_IDataObject
) && (cidl
>= 1))
426 hr
= IDataObject_Constructor (hwndOwner
,
427 pidlRoot
, apidl
, cidl
, (IDataObject
**)&pObj
);
429 else if (IsEqualIID (riid
, IID_IExtractIconA
) && (cidl
== 1))
431 pidl
= ILCombine (pidlRoot
, apidl
[0]);
432 pObj
= IExtractIconA_Constructor (pidl
);
436 else if (IsEqualIID (riid
, IID_IExtractIconW
) && (cidl
== 1))
438 pidl
= ILCombine (pidlRoot
, apidl
[0]);
439 pObj
= IExtractIconW_Constructor (pidl
);
443 else if (IsEqualIID (riid
, IID_IDropTarget
) && (cidl
>= 1))
445 IDropTarget
* pDt
= NULL
;
446 hr
= this->QueryInterface(IID_PPV_ARG(IDropTarget
, &pDt
));
449 else if ((IsEqualIID(riid
, IID_IShellLinkW
) ||
450 IsEqualIID(riid
, IID_IShellLinkA
)) && (cidl
== 1))
452 pidl
= ILCombine (pidlRoot
, apidl
[0]);
453 hr
= IShellLink_ConstructFromFile(NULL
, riid
, pidl
, (LPVOID
*) &pObj
);
459 if (SUCCEEDED(hr
) && !pObj
)
463 TRACE ("(%p)->hr=0x%08x\n", this, hr
);
467 /**************************************************************************
468 * CDrivesFolder::GetDisplayNameOf
470 HRESULT WINAPI
CDrivesFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET strRet
)
475 TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl
, dwFlags
, strRet
);
481 pszPath
= (LPWSTR
)CoTaskMemAlloc((MAX_PATH
+ 1) * sizeof(WCHAR
));
483 return E_OUTOFMEMORY
;
489 /* parsing name like ::{...} */
492 SHELL32_GUIDToStringW(CLSID_MyComputer
, &pszPath
[2]);
494 else if (_ILIsPidlSimple(pidl
))
496 /* take names of special folders only if its only this folder */
497 if (_ILIsSpecialFolder(pidl
))
501 clsid
= _ILGetGUIDPointer (pidl
);
504 if (GET_SHGDN_FOR (dwFlags
) == SHGDN_FORPARSING
)
506 static const WCHAR clsidW
[] = L
"CLSID\\";
507 static const WCHAR shellfolderW
[] = L
"\\shellfolder";
508 static const WCHAR wantsForParsingW
[] = L
"WantsForParsing";
509 BOOL bWantsForParsing
= FALSE
;
510 WCHAR szRegPath
[100];
514 * We can only get a filesystem path from a shellfolder
515 * if the value WantsFORPARSING exists in
516 * CLSID\\{...}\\shellfolder
517 * exception: the MyComputer folder has this keys not
518 * but like any filesystem backed
519 * folder it needs these behaviour
521 * Get the "WantsFORPARSING" flag from the registry
524 wcscpy(szRegPath
, clsidW
);
525 SHELL32_GUIDToStringW(*clsid
, &szRegPath
[6]);
526 wcscat(szRegPath
, shellfolderW
);
527 r
= SHGetValueW(HKEY_CLASSES_ROOT
, szRegPath
,
528 wantsForParsingW
, NULL
, NULL
, NULL
);
529 if (r
== ERROR_SUCCESS
)
530 bWantsForParsing
= TRUE
;
532 if ((GET_SHGDN_RELATION (dwFlags
) == SHGDN_NORMAL
) &&
536 * We need the filesystem path to the destination folder
537 * Only the folder itself can know it
539 hr
= SHELL32_GetDisplayNameOfChild (this, pidl
,
540 dwFlags
, pszPath
, MAX_PATH
);
546 /* parsing name like ::{...} */
550 p
+= SHELL32_GUIDToStringW(CLSID_MyComputer
, p
);
557 SHELL32_GUIDToStringW(*clsid
, p
);
562 /* user friendly name */
564 if (_ILIsMyComputer(pidl
) && sName
)
565 wcscpy(pszPath
, sName
);
567 HCR_GetClassNameW (*clsid
, pszPath
, MAX_PATH
);
569 TRACE("pszPath %s\n", debugstr_w(pszPath
));
574 /* append my own path */
575 _ILSimpleGetTextW(pidl
, pszPath
, MAX_PATH
);
578 else if (_ILIsDrive(pidl
))
581 _ILSimpleGetTextW(pidl
, pszPath
, MAX_PATH
); /* append my own path */
582 /* long view "lw_name (C:)" */
583 if (!(dwFlags
& SHGDN_FORPARSING
))
585 WCHAR wszDrive
[18] = {0};
586 DWORD dwVolumeSerialNumber
, dwMaximumComponentLength
, dwFileSystemFlags
;
587 static const WCHAR wszOpenBracket
[] = {' ', '(', 0};
588 static const WCHAR wszCloseBracket
[] = {')', 0};
590 lstrcpynW(wszDrive
, pszPath
, 4);
592 GetVolumeInformationW(wszDrive
, pszPath
,
594 &dwVolumeSerialNumber
,
595 &dwMaximumComponentLength
, &dwFileSystemFlags
, NULL
, 0);
596 pszPath
[MAX_PATH
-1] = L
'\0';
597 if (!wcslen(pszPath
))
599 UINT DriveType
, ResourceId
;
600 DriveType
= GetDriveTypeW(wszDrive
);
604 ResourceId
= IDS_DRIVE_FIXED
;
607 ResourceId
= IDS_DRIVE_NETWORK
;
610 ResourceId
= IDS_DRIVE_CDROM
;
617 dwFileSystemFlags
= LoadStringW(shell32_hInstance
, ResourceId
, pszPath
, MAX_PATH
);
618 if (dwFileSystemFlags
> MAX_PATH
- 7)
619 pszPath
[MAX_PATH
-7] = L
'\0';
622 wcscat (pszPath
, wszOpenBracket
);
624 wcscat (pszPath
, wszDrive
);
625 wcscat (pszPath
, wszCloseBracket
);
630 /* Neither a shell namespace extension nor a drive letter. */
631 ERR("Wrong pidl type\n");
632 CoTaskMemFree(pszPath
);
638 /* Complex pidl. Let the child folder do the work */
639 hr
= SHELL32_GetDisplayNameOfChild(this, pidl
, dwFlags
, pszPath
, MAX_PATH
);
644 strRet
->uType
= STRRET_WSTR
;
645 strRet
->pOleStr
= pszPath
;
648 CoTaskMemFree(pszPath
);
650 TRACE("-- (%p)->(%s)\n", this, strRet
->uType
== STRRET_CSTR
? strRet
->cStr
: debugstr_w(strRet
->pOleStr
));
654 /**************************************************************************
655 * CDrivesFolder::SetNameOf
656 * Changes the name of a file object or subfolder, possibly changing its item
657 * identifier in the process.
660 * hwndOwner [in] Owner window for output
661 * pidl [in] simple pidl of item to change
662 * lpszName [in] the items new display name
663 * dwFlags [in] SHGNO formatting flags
664 * ppidlOut [out] simple pidl returned
666 HRESULT WINAPI
CDrivesFolder::SetNameOf(HWND hwndOwner
, PCUITEMID_CHILD pidl
,
667 LPCOLESTR lpName
, DWORD dwFlags
, PITEMID_CHILD
*pPidlOut
)
674 TRACE("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this,
675 hwndOwner
, pidl
, debugstr_w (lpName
), dwFlags
, pPidlOut
);
677 if (_ILIsDrive(pidl
))
679 if (_ILSimpleGetTextW(pidl
, szName
, _countof(szName
)))
680 SetVolumeLabelW(szName
, lpName
);
682 *pPidlOut
= _ILCreateDrive(szName
);
687 if (pPidlOut
!= NULL
)
688 *pPidlOut
= _ILCreateMyComputer();
690 length
= (wcslen(lpName
) + 1) * sizeof(WCHAR
);
691 sName
= (LPWSTR
)SHAlloc(length
);
694 return E_OUTOFMEMORY
;
696 if (RegOpenKeyExW(HKEY_CURRENT_USER
,
697 L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\{20D04FE0-3AEA-1069-A2D8-08002B30309D}",
700 &hKey
) != ERROR_SUCCESS
)
702 WARN("Error: failed to open registry key\n");
706 RegSetValueExW(hKey
, NULL
, 0, REG_SZ
, (const LPBYTE
)lpName
, length
);
710 wcscpy(sName
, lpName
);
713 TRACE("result %s\n", debugstr_w(sName
));
717 HRESULT WINAPI
CDrivesFolder::GetDefaultSearchGUID(GUID
* pguid
)
719 FIXME ("(%p)\n", this);
723 HRESULT WINAPI
CDrivesFolder::EnumSearches(IEnumExtraSearch
** ppenum
)
725 FIXME ("(%p)\n", this);
729 HRESULT WINAPI
CDrivesFolder::GetDefaultColumn (DWORD dwRes
, ULONG
*pSort
, ULONG
*pDisplay
)
731 TRACE ("(%p)\n", this);
740 HRESULT WINAPI
CDrivesFolder::GetDefaultColumnState(UINT iColumn
, DWORD
* pcsFlags
)
742 TRACE ("(%p)\n", this);
744 if (!pcsFlags
|| iColumn
>= MYCOMPUTERSHELLVIEWCOLUMNS
)
746 *pcsFlags
= MyComputerSFHeader
[iColumn
].pcsFlags
;
750 HRESULT WINAPI
CDrivesFolder::GetDetailsEx(PCUITEMID_CHILD pidl
, const SHCOLUMNID
* pscid
, VARIANT
* pv
)
752 FIXME ("(%p)\n", this);
756 /* FIXME: drive size >4GB is rolling over */
757 HRESULT WINAPI
CDrivesFolder::GetDetailsOf(PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
*psd
)
761 TRACE ("(%p)->(%p %i %p)\n", this, pidl
, iColumn
, psd
);
763 if (!psd
|| iColumn
>= MYCOMPUTERSHELLVIEWCOLUMNS
)
768 psd
->fmt
= MyComputerSFHeader
[iColumn
].fmt
;
769 psd
->cxChar
= MyComputerSFHeader
[iColumn
].cxChar
;
770 psd
->str
.uType
= STRRET_CSTR
;
771 LoadStringA(shell32_hInstance
, MyComputerSFHeader
[iColumn
].colnameid
,
772 psd
->str
.cStr
, MAX_PATH
);
777 char szPath
[MAX_PATH
];
778 ULARGE_INTEGER ulBytes
;
780 psd
->str
.cStr
[0] = 0x00;
781 psd
->str
.uType
= STRRET_CSTR
;
785 hr
= GetDisplayNameOf(pidl
,
786 SHGDN_NORMAL
| SHGDN_INFOLDER
, &psd
->str
);
789 _ILGetFileType(pidl
, psd
->str
.cStr
, MAX_PATH
);
791 case 2: /* total size */
792 if (_ILIsDrive(pidl
))
794 _ILSimpleGetText (pidl
, szPath
, MAX_PATH
);
795 GetDiskFreeSpaceExA (szPath
, NULL
, &ulBytes
, NULL
);
796 StrFormatByteSizeA (ulBytes
.LowPart
, psd
->str
.cStr
, MAX_PATH
);
799 case 3: /* free size */
800 if (_ILIsDrive(pidl
))
802 _ILSimpleGetText (pidl
, szPath
, MAX_PATH
);
803 GetDiskFreeSpaceExA (szPath
, &ulBytes
, NULL
, NULL
);
804 StrFormatByteSizeA (ulBytes
.LowPart
, psd
->str
.cStr
, MAX_PATH
);
814 HRESULT WINAPI
CDrivesFolder::MapColumnToSCID(UINT column
, SHCOLUMNID
* pscid
)
816 FIXME("(%p)\n", this);
820 /************************************************************************
821 * CDrivesFolder::GetClassID
823 HRESULT WINAPI
CDrivesFolder::GetClassID(CLSID
*lpClassId
)
825 TRACE ("(%p)\n", this);
830 *lpClassId
= CLSID_MyComputer
;
834 /************************************************************************
835 * CDrivesFolder::Initialize
837 * NOTES: it makes no sense to change the pidl
839 HRESULT WINAPI
CDrivesFolder::Initialize(LPCITEMIDLIST pidl
)
841 TRACE ("(%p)->(%p)\n", this, pidl
);
844 SHFree((LPVOID
)pidlRoot
);
846 pidlRoot
= ILClone(pidl
);
850 /**************************************************************************
851 * CDrivesFolder::GetCurFolder
853 HRESULT WINAPI
CDrivesFolder::GetCurFolder(LPITEMIDLIST
*pidl
)
855 TRACE("(%p)->(%p)\n", this, pidl
);
860 *pidl
= ILClone(pidlRoot
);