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 IID
*iid
= _ILGetGUIDPointer(pidl
);
337 TRACE("(%p)\n", pidl
);
340 return IsEqualIID(iid
, 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
;
381 SHELL32_GetItemAttributes(this, apidl
[i
], rgfInOut
);
386 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
387 *rgfInOut
&= ~SFGAO_VALIDATE
;
389 TRACE ("-- result=0x%08x\n", *rgfInOut
);
393 /**************************************************************************
394 * CDrivesFolder::GetUIObjectOf
397 * hwndOwner [in] Parent window for any output
398 * cidl [in] array size
399 * apidl [in] simple pidl array
400 * riid [in] Requested Interface
401 * prgfInOut [ ] reserved
402 * ppvObject [out] Resulting Interface
405 HRESULT WINAPI
CDrivesFolder::GetUIObjectOf(HWND hwndOwner
,
406 UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
,
407 REFIID riid
, UINT
*prgfInOut
, LPVOID
*ppvOut
)
410 IUnknown
*pObj
= NULL
;
411 HRESULT hr
= E_INVALIDARG
;
413 TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", this,
414 hwndOwner
, cidl
, apidl
, shdebugstr_guid (&riid
), prgfInOut
, ppvOut
);
421 if (IsEqualIID (riid
, IID_IContextMenu
) && (cidl
>= 1))
423 hr
= CDefFolderMenu_Create2(pidlRoot
, hwndOwner
, cidl
, apidl
, (IShellFolder
*)this, NULL
, 0, NULL
, (IContextMenu
**)&pObj
);
425 else if (IsEqualIID (riid
, IID_IDataObject
) && (cidl
>= 1))
427 hr
= IDataObject_Constructor (hwndOwner
,
428 pidlRoot
, apidl
, cidl
, (IDataObject
**)&pObj
);
430 else if (IsEqualIID (riid
, IID_IExtractIconA
) && (cidl
== 1))
432 pidl
= ILCombine (pidlRoot
, apidl
[0]);
433 pObj
= IExtractIconA_Constructor (pidl
);
437 else if (IsEqualIID (riid
, IID_IExtractIconW
) && (cidl
== 1))
439 pidl
= ILCombine (pidlRoot
, apidl
[0]);
440 pObj
= IExtractIconW_Constructor (pidl
);
444 else if (IsEqualIID (riid
, IID_IDropTarget
) && (cidl
>= 1))
446 IDropTarget
* pDt
= NULL
;
447 hr
= this->QueryInterface(IID_PPV_ARG(IDropTarget
, &pDt
));
450 else if ((IsEqualIID(riid
, IID_IShellLinkW
) ||
451 IsEqualIID(riid
, IID_IShellLinkA
)) && (cidl
== 1))
453 pidl
= ILCombine (pidlRoot
, apidl
[0]);
454 hr
= IShellLink_ConstructFromFile(NULL
, riid
, pidl
, (LPVOID
*) &pObj
);
460 if (SUCCEEDED(hr
) && !pObj
)
464 TRACE ("(%p)->hr=0x%08x\n", this, hr
);
468 /**************************************************************************
469 * CDrivesFolder::GetDisplayNameOf
471 HRESULT WINAPI
CDrivesFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET strRet
)
476 TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl
, dwFlags
, strRet
);
482 pszPath
= (LPWSTR
)CoTaskMemAlloc((MAX_PATH
+ 1) * sizeof(WCHAR
));
484 return E_OUTOFMEMORY
;
490 /* parsing name like ::{...} */
493 SHELL32_GUIDToStringW(CLSID_MyComputer
, &pszPath
[2]);
495 else if (_ILIsPidlSimple(pidl
))
497 /* take names of special folders only if its only this folder */
498 if (_ILIsSpecialFolder(pidl
))
502 clsid
= _ILGetGUIDPointer (pidl
);
505 if (GET_SHGDN_FOR (dwFlags
) == SHGDN_FORPARSING
)
507 static const WCHAR clsidW
[] = L
"CLSID\\";
508 static const WCHAR shellfolderW
[] = L
"\\shellfolder";
509 static const WCHAR wantsForParsingW
[] = L
"WantsForParsing";
510 BOOL bWantsForParsing
= FALSE
;
511 WCHAR szRegPath
[100];
515 * We can only get a filesystem path from a shellfolder
516 * if the value WantsFORPARSING exists in
517 * CLSID\\{...}\\shellfolder
518 * exception: the MyComputer folder has this keys not
519 * but like any filesystem backed
520 * folder it needs these behaviour
522 * Get the "WantsFORPARSING" flag from the registry
525 wcscpy(szRegPath
, clsidW
);
526 SHELL32_GUIDToStringW(*clsid
, &szRegPath
[6]);
527 wcscat(szRegPath
, shellfolderW
);
528 r
= SHGetValueW(HKEY_CLASSES_ROOT
, szRegPath
,
529 wantsForParsingW
, NULL
, NULL
, NULL
);
530 if (r
== ERROR_SUCCESS
)
531 bWantsForParsing
= TRUE
;
533 if ((GET_SHGDN_RELATION (dwFlags
) == SHGDN_NORMAL
) &&
537 * We need the filesystem path to the destination folder
538 * Only the folder itself can know it
540 hr
= SHELL32_GetDisplayNameOfChild (this, pidl
,
541 dwFlags
, pszPath
, MAX_PATH
);
547 /* parsing name like ::{...} */
551 p
+= SHELL32_GUIDToStringW(CLSID_MyComputer
, p
);
558 SHELL32_GUIDToStringW(*clsid
, p
);
563 /* user friendly name */
565 if (_ILIsMyComputer(pidl
) && sName
)
566 wcscpy(pszPath
, sName
);
568 HCR_GetClassNameW (*clsid
, pszPath
, MAX_PATH
);
570 TRACE("pszPath %s\n", debugstr_w(pszPath
));
575 /* append my own path */
576 _ILSimpleGetTextW(pidl
, pszPath
, MAX_PATH
);
579 else if (_ILIsDrive(pidl
))
582 _ILSimpleGetTextW(pidl
, pszPath
, MAX_PATH
); /* append my own path */
583 /* long view "lw_name (C:)" */
584 if (!(dwFlags
& SHGDN_FORPARSING
))
586 WCHAR wszDrive
[18] = {0};
587 DWORD dwVolumeSerialNumber
, dwMaximumComponentLength
, dwFileSystemFlags
;
588 static const WCHAR wszOpenBracket
[] = {' ', '(', 0};
589 static const WCHAR wszCloseBracket
[] = {')', 0};
591 lstrcpynW(wszDrive
, pszPath
, 4);
593 GetVolumeInformationW(wszDrive
, pszPath
,
595 &dwVolumeSerialNumber
,
596 &dwMaximumComponentLength
, &dwFileSystemFlags
, NULL
, 0);
597 pszPath
[MAX_PATH
-1] = L
'\0';
598 if (!wcslen(pszPath
))
600 UINT DriveType
, ResourceId
;
601 DriveType
= GetDriveTypeW(wszDrive
);
605 ResourceId
= IDS_DRIVE_FIXED
;
608 ResourceId
= IDS_DRIVE_NETWORK
;
611 ResourceId
= IDS_DRIVE_CDROM
;
618 dwFileSystemFlags
= LoadStringW(shell32_hInstance
, ResourceId
, pszPath
, MAX_PATH
);
619 if (dwFileSystemFlags
> MAX_PATH
- 7)
620 pszPath
[MAX_PATH
-7] = L
'\0';
623 wcscat (pszPath
, wszOpenBracket
);
625 wcscat (pszPath
, wszDrive
);
626 wcscat (pszPath
, wszCloseBracket
);
631 /* Neither a shell namespace extension nor a drive letter. */
632 ERR("Wrong pidl type\n");
633 CoTaskMemFree(pszPath
);
639 /* Complex pidl. Let the child folder do the work */
640 hr
= SHELL32_GetDisplayNameOfChild(this, pidl
, dwFlags
, pszPath
, MAX_PATH
);
645 strRet
->uType
= STRRET_WSTR
;
646 strRet
->pOleStr
= pszPath
;
649 CoTaskMemFree(pszPath
);
651 TRACE("-- (%p)->(%s)\n", this, strRet
->uType
== STRRET_CSTR
? strRet
->cStr
: debugstr_w(strRet
->pOleStr
));
655 /**************************************************************************
656 * CDrivesFolder::SetNameOf
657 * Changes the name of a file object or subfolder, possibly changing its item
658 * identifier in the process.
661 * hwndOwner [in] Owner window for output
662 * pidl [in] simple pidl of item to change
663 * lpszName [in] the items new display name
664 * dwFlags [in] SHGNO formatting flags
665 * ppidlOut [out] simple pidl returned
667 HRESULT WINAPI
CDrivesFolder::SetNameOf(HWND hwndOwner
, PCUITEMID_CHILD pidl
,
668 LPCOLESTR lpName
, DWORD dwFlags
, PITEMID_CHILD
*pPidlOut
)
675 TRACE("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this,
676 hwndOwner
, pidl
, debugstr_w (lpName
), dwFlags
, pPidlOut
);
678 if (_ILIsDrive(pidl
))
680 if (_ILSimpleGetTextW(pidl
, szName
, _countof(szName
)))
681 SetVolumeLabelW(szName
, lpName
);
683 *pPidlOut
= _ILCreateDrive(szName
);
688 if (pPidlOut
!= NULL
)
689 *pPidlOut
= _ILCreateMyComputer();
691 length
= (wcslen(lpName
) + 1) * sizeof(WCHAR
);
692 sName
= (LPWSTR
)SHAlloc(length
);
695 return E_OUTOFMEMORY
;
697 if (RegOpenKeyExW(HKEY_CURRENT_USER
,
698 L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\{20D04FE0-3AEA-1069-A2D8-08002B30309D}",
701 &hKey
) != ERROR_SUCCESS
)
703 WARN("Error: failed to open registry key\n");
707 RegSetValueExW(hKey
, NULL
, 0, REG_SZ
, (const LPBYTE
)lpName
, length
);
711 wcscpy(sName
, lpName
);
714 TRACE("result %s\n", debugstr_w(sName
));
718 HRESULT WINAPI
CDrivesFolder::GetDefaultSearchGUID(GUID
* pguid
)
720 FIXME ("(%p)\n", this);
724 HRESULT WINAPI
CDrivesFolder::EnumSearches(IEnumExtraSearch
** ppenum
)
726 FIXME ("(%p)\n", this);
730 HRESULT WINAPI
CDrivesFolder::GetDefaultColumn (DWORD dwRes
, ULONG
*pSort
, ULONG
*pDisplay
)
732 TRACE ("(%p)\n", this);
741 HRESULT WINAPI
CDrivesFolder::GetDefaultColumnState(UINT iColumn
, DWORD
* pcsFlags
)
743 TRACE ("(%p)\n", this);
745 if (!pcsFlags
|| iColumn
>= MYCOMPUTERSHELLVIEWCOLUMNS
)
747 *pcsFlags
= MyComputerSFHeader
[iColumn
].pcsFlags
;
751 HRESULT WINAPI
CDrivesFolder::GetDetailsEx(PCUITEMID_CHILD pidl
, const SHCOLUMNID
* pscid
, VARIANT
* pv
)
753 FIXME ("(%p)\n", this);
757 /* FIXME: drive size >4GB is rolling over */
758 HRESULT WINAPI
CDrivesFolder::GetDetailsOf(PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
*psd
)
762 TRACE ("(%p)->(%p %i %p)\n", this, pidl
, iColumn
, psd
);
764 if (!psd
|| iColumn
>= MYCOMPUTERSHELLVIEWCOLUMNS
)
769 psd
->fmt
= MyComputerSFHeader
[iColumn
].fmt
;
770 psd
->cxChar
= MyComputerSFHeader
[iColumn
].cxChar
;
771 psd
->str
.uType
= STRRET_CSTR
;
772 LoadStringA(shell32_hInstance
, MyComputerSFHeader
[iColumn
].colnameid
,
773 psd
->str
.cStr
, MAX_PATH
);
778 char szPath
[MAX_PATH
];
779 ULARGE_INTEGER ulBytes
;
781 psd
->str
.cStr
[0] = 0x00;
782 psd
->str
.uType
= STRRET_CSTR
;
786 hr
= GetDisplayNameOf(pidl
,
787 SHGDN_NORMAL
| SHGDN_INFOLDER
, &psd
->str
);
790 _ILGetFileType(pidl
, psd
->str
.cStr
, MAX_PATH
);
792 case 2: /* total size */
793 if (_ILIsDrive(pidl
))
795 _ILSimpleGetText (pidl
, szPath
, MAX_PATH
);
796 GetDiskFreeSpaceExA (szPath
, NULL
, &ulBytes
, NULL
);
797 StrFormatByteSizeA (ulBytes
.LowPart
, psd
->str
.cStr
, MAX_PATH
);
800 case 3: /* free size */
801 if (_ILIsDrive(pidl
))
803 _ILSimpleGetText (pidl
, szPath
, MAX_PATH
);
804 GetDiskFreeSpaceExA (szPath
, &ulBytes
, NULL
, NULL
);
805 StrFormatByteSizeA (ulBytes
.LowPart
, psd
->str
.cStr
, MAX_PATH
);
815 HRESULT WINAPI
CDrivesFolder::MapColumnToSCID(UINT column
, SHCOLUMNID
* pscid
)
817 FIXME("(%p)\n", this);
821 /************************************************************************
822 * CDrivesFolder::GetClassID
824 HRESULT WINAPI
CDrivesFolder::GetClassID(CLSID
*lpClassId
)
826 TRACE ("(%p)\n", this);
831 *lpClassId
= CLSID_MyComputer
;
835 /************************************************************************
836 * CDrivesFolder::Initialize
838 * NOTES: it makes no sense to change the pidl
840 HRESULT WINAPI
CDrivesFolder::Initialize(LPCITEMIDLIST pidl
)
842 TRACE ("(%p)->(%p)\n", this, pidl
);
845 SHFree((LPVOID
)pidlRoot
);
847 pidlRoot
= ILClone(pidl
);
851 /**************************************************************************
852 * CDrivesFolder::GetCurFolder
854 HRESULT WINAPI
CDrivesFolder::GetCurFolder(LPITEMIDLIST
*pidl
)
856 TRACE("(%p)->(%p)\n", this, pidl
);
861 *pidl
= ILClone(pidlRoot
);