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 /**************************************************************************
334 * CDrivesFolder::GetAttributesOf
336 HRESULT WINAPI
CDrivesFolder::GetAttributesOf(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
* rgfInOut
)
338 static const DWORD dwComputerAttributes
=
339 SFGAO_CANRENAME
| SFGAO_CANDELETE
| SFGAO_HASPROPSHEET
| SFGAO_DROPTARGET
|
340 SFGAO_FILESYSANCESTOR
| SFGAO_FOLDER
| SFGAO_HASSUBFOLDER
| SFGAO_CANLINK
;
341 static const DWORD dwControlPanelAttributes
=
342 SFGAO_HASSUBFOLDER
| SFGAO_FOLDER
| SFGAO_CANLINK
;
343 static const DWORD dwDriveAttributes
=
344 SFGAO_HASSUBFOLDER
| SFGAO_FILESYSTEM
| SFGAO_FOLDER
| SFGAO_FILESYSANCESTOR
|
345 SFGAO_DROPTARGET
| SFGAO_HASPROPSHEET
| SFGAO_CANRENAME
| SFGAO_CANLINK
;
347 TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
348 this, cidl
, apidl
, rgfInOut
, rgfInOut
? *rgfInOut
: 0);
356 /* FIXME: always add SFGAO_CANLINK */
358 *rgfInOut
&= dwComputerAttributes
;
361 for (UINT i
= 0; i
< cidl
; ++i
)
363 if (_ILIsDrive(apidl
[i
]))
364 *rgfInOut
&= dwDriveAttributes
;
365 else if (_ILIsControlPanel(apidl
[i
]))
366 *rgfInOut
&= dwControlPanelAttributes
;
370 SHELL32_GetItemAttributes(this, apidl
[i
], rgfInOut
);
375 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
376 *rgfInOut
&= ~SFGAO_VALIDATE
;
378 TRACE ("-- result=0x%08x\n", *rgfInOut
);
382 /**************************************************************************
383 * CDrivesFolder::GetUIObjectOf
386 * hwndOwner [in] Parent window for any output
387 * cidl [in] array size
388 * apidl [in] simple pidl array
389 * riid [in] Requested Interface
390 * prgfInOut [ ] reserved
391 * ppvObject [out] Resulting Interface
394 HRESULT WINAPI
CDrivesFolder::GetUIObjectOf(HWND hwndOwner
,
395 UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
,
396 REFIID riid
, UINT
*prgfInOut
, LPVOID
*ppvOut
)
399 IUnknown
*pObj
= NULL
;
400 HRESULT hr
= E_INVALIDARG
;
402 TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", this,
403 hwndOwner
, cidl
, apidl
, shdebugstr_guid (&riid
), prgfInOut
, ppvOut
);
410 if (IsEqualIID (riid
, IID_IContextMenu
) && (cidl
>= 1))
412 hr
= CDefFolderMenu_Create2(pidlRoot
, hwndOwner
, cidl
, apidl
, (IShellFolder
*)this, NULL
, 0, NULL
, (IContextMenu
**)&pObj
);
414 else if (IsEqualIID (riid
, IID_IDataObject
) && (cidl
>= 1))
416 hr
= IDataObject_Constructor (hwndOwner
,
417 pidlRoot
, apidl
, cidl
, (IDataObject
**)&pObj
);
419 else if (IsEqualIID (riid
, IID_IExtractIconA
) && (cidl
== 1))
421 pidl
= ILCombine (pidlRoot
, apidl
[0]);
422 pObj
= IExtractIconA_Constructor (pidl
);
426 else if (IsEqualIID (riid
, IID_IExtractIconW
) && (cidl
== 1))
428 pidl
= ILCombine (pidlRoot
, apidl
[0]);
429 pObj
= IExtractIconW_Constructor (pidl
);
433 else if (IsEqualIID (riid
, IID_IDropTarget
) && (cidl
>= 1))
435 IDropTarget
* pDt
= NULL
;
436 hr
= this->QueryInterface(IID_PPV_ARG(IDropTarget
, &pDt
));
439 else if ((IsEqualIID(riid
, IID_IShellLinkW
) ||
440 IsEqualIID(riid
, IID_IShellLinkA
)) && (cidl
== 1))
442 pidl
= ILCombine (pidlRoot
, apidl
[0]);
443 hr
= IShellLink_ConstructFromFile(NULL
, riid
, pidl
, (LPVOID
*) &pObj
);
449 if (SUCCEEDED(hr
) && !pObj
)
453 TRACE ("(%p)->hr=0x%08x\n", this, hr
);
457 /**************************************************************************
458 * CDrivesFolder::GetDisplayNameOf
460 HRESULT WINAPI
CDrivesFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET strRet
)
465 TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl
, dwFlags
, strRet
);
471 pszPath
= (LPWSTR
)CoTaskMemAlloc((MAX_PATH
+ 1) * sizeof(WCHAR
));
473 return E_OUTOFMEMORY
;
479 /* parsing name like ::{...} */
482 SHELL32_GUIDToStringW(CLSID_MyComputer
, &pszPath
[2]);
484 else if (_ILIsPidlSimple(pidl
))
486 /* take names of special folders only if its only this folder */
487 if (_ILIsSpecialFolder(pidl
))
491 clsid
= _ILGetGUIDPointer (pidl
);
494 if (GET_SHGDN_FOR (dwFlags
) == SHGDN_FORPARSING
)
496 static const WCHAR clsidW
[] = L
"CLSID\\";
497 static const WCHAR shellfolderW
[] = L
"\\shellfolder";
498 static const WCHAR wantsForParsingW
[] = L
"WantsForParsing";
499 BOOL bWantsForParsing
= FALSE
;
500 WCHAR szRegPath
[100];
504 * We can only get a filesystem path from a shellfolder
505 * if the value WantsFORPARSING exists in
506 * CLSID\\{...}\\shellfolder
507 * exception: the MyComputer folder has this keys not
508 * but like any filesystem backed
509 * folder it needs these behaviour
511 * Get the "WantsFORPARSING" flag from the registry
514 wcscpy(szRegPath
, clsidW
);
515 SHELL32_GUIDToStringW(*clsid
, &szRegPath
[6]);
516 wcscat(szRegPath
, shellfolderW
);
517 r
= SHGetValueW(HKEY_CLASSES_ROOT
, szRegPath
,
518 wantsForParsingW
, NULL
, NULL
, NULL
);
519 if (r
== ERROR_SUCCESS
)
520 bWantsForParsing
= TRUE
;
522 if ((GET_SHGDN_RELATION (dwFlags
) == SHGDN_NORMAL
) &&
526 * We need the filesystem path to the destination folder
527 * Only the folder itself can know it
529 hr
= SHELL32_GetDisplayNameOfChild (this, pidl
,
530 dwFlags
, pszPath
, MAX_PATH
);
536 /* parsing name like ::{...} */
540 p
+= SHELL32_GUIDToStringW(CLSID_MyComputer
, p
);
547 SHELL32_GUIDToStringW(*clsid
, p
);
552 /* user friendly name */
554 if (_ILIsMyComputer(pidl
) && sName
)
555 wcscpy(pszPath
, sName
);
557 HCR_GetClassNameW (*clsid
, pszPath
, MAX_PATH
);
559 TRACE("pszPath %s\n", debugstr_w(pszPath
));
564 /* append my own path */
565 _ILSimpleGetTextW(pidl
, pszPath
, MAX_PATH
);
568 else if (_ILIsDrive(pidl
))
571 _ILSimpleGetTextW(pidl
, pszPath
, MAX_PATH
); /* append my own path */
572 /* long view "lw_name (C:)" */
573 if (!(dwFlags
& SHGDN_FORPARSING
))
575 WCHAR wszDrive
[18] = {0};
576 DWORD dwVolumeSerialNumber
, dwMaximumComponentLength
, dwFileSystemFlags
;
577 static const WCHAR wszOpenBracket
[] = {' ', '(', 0};
578 static const WCHAR wszCloseBracket
[] = {')', 0};
580 lstrcpynW(wszDrive
, pszPath
, 4);
582 GetVolumeInformationW(wszDrive
, pszPath
,
584 &dwVolumeSerialNumber
,
585 &dwMaximumComponentLength
, &dwFileSystemFlags
, NULL
, 0);
586 pszPath
[MAX_PATH
-1] = L
'\0';
587 if (!wcslen(pszPath
))
589 UINT DriveType
, ResourceId
;
590 DriveType
= GetDriveTypeW(wszDrive
);
594 ResourceId
= IDS_DRIVE_FIXED
;
597 ResourceId
= IDS_DRIVE_NETWORK
;
600 ResourceId
= IDS_DRIVE_CDROM
;
607 dwFileSystemFlags
= LoadStringW(shell32_hInstance
, ResourceId
, pszPath
, MAX_PATH
);
608 if (dwFileSystemFlags
> MAX_PATH
- 7)
609 pszPath
[MAX_PATH
-7] = L
'\0';
612 wcscat (pszPath
, wszOpenBracket
);
614 wcscat (pszPath
, wszDrive
);
615 wcscat (pszPath
, wszCloseBracket
);
620 /* Neither a shell namespace extension nor a drive letter. */
621 ERR("Wrong pidl type\n");
622 CoTaskMemFree(pszPath
);
628 /* Complex pidl. Let the child folder do the work */
629 hr
= SHELL32_GetDisplayNameOfChild(this, pidl
, dwFlags
, pszPath
, MAX_PATH
);
634 strRet
->uType
= STRRET_WSTR
;
635 strRet
->pOleStr
= pszPath
;
638 CoTaskMemFree(pszPath
);
640 TRACE("-- (%p)->(%s)\n", this, strRet
->uType
== STRRET_CSTR
? strRet
->cStr
: debugstr_w(strRet
->pOleStr
));
644 /**************************************************************************
645 * CDrivesFolder::SetNameOf
646 * Changes the name of a file object or subfolder, possibly changing its item
647 * identifier in the process.
650 * hwndOwner [in] Owner window for output
651 * pidl [in] simple pidl of item to change
652 * lpszName [in] the items new display name
653 * dwFlags [in] SHGNO formatting flags
654 * ppidlOut [out] simple pidl returned
656 HRESULT WINAPI
CDrivesFolder::SetNameOf(HWND hwndOwner
, PCUITEMID_CHILD pidl
,
657 LPCOLESTR lpName
, DWORD dwFlags
, PITEMID_CHILD
*pPidlOut
)
664 TRACE("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this,
665 hwndOwner
, pidl
, debugstr_w (lpName
), dwFlags
, pPidlOut
);
667 if (_ILIsDrive(pidl
))
669 if (_ILSimpleGetTextW(pidl
, szName
, _countof(szName
)))
670 SetVolumeLabelW(szName
, lpName
);
672 *pPidlOut
= _ILCreateDrive(szName
);
677 if (pPidlOut
!= NULL
)
678 *pPidlOut
= _ILCreateMyComputer();
680 length
= (wcslen(lpName
) + 1) * sizeof(WCHAR
);
681 sName
= (LPWSTR
)SHAlloc(length
);
684 return E_OUTOFMEMORY
;
686 if (RegOpenKeyExW(HKEY_CURRENT_USER
,
687 L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\{20D04FE0-3AEA-1069-A2D8-08002B30309D}",
690 &hKey
) != ERROR_SUCCESS
)
692 WARN("Error: failed to open registry key\n");
696 RegSetValueExW(hKey
, NULL
, 0, REG_SZ
, (const LPBYTE
)lpName
, length
);
700 wcscpy(sName
, lpName
);
703 TRACE("result %s\n", debugstr_w(sName
));
707 HRESULT WINAPI
CDrivesFolder::GetDefaultSearchGUID(GUID
* pguid
)
709 FIXME ("(%p)\n", this);
713 HRESULT WINAPI
CDrivesFolder::EnumSearches(IEnumExtraSearch
** ppenum
)
715 FIXME ("(%p)\n", this);
719 HRESULT WINAPI
CDrivesFolder::GetDefaultColumn (DWORD dwRes
, ULONG
*pSort
, ULONG
*pDisplay
)
721 TRACE ("(%p)\n", this);
730 HRESULT WINAPI
CDrivesFolder::GetDefaultColumnState(UINT iColumn
, DWORD
* pcsFlags
)
732 TRACE ("(%p)\n", this);
734 if (!pcsFlags
|| iColumn
>= MYCOMPUTERSHELLVIEWCOLUMNS
)
736 *pcsFlags
= MyComputerSFHeader
[iColumn
].pcsFlags
;
740 HRESULT WINAPI
CDrivesFolder::GetDetailsEx(PCUITEMID_CHILD pidl
, const SHCOLUMNID
* pscid
, VARIANT
* pv
)
742 FIXME ("(%p)\n", this);
746 /* FIXME: drive size >4GB is rolling over */
747 HRESULT WINAPI
CDrivesFolder::GetDetailsOf(PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
*psd
)
751 TRACE ("(%p)->(%p %i %p)\n", this, pidl
, iColumn
, psd
);
753 if (!psd
|| iColumn
>= MYCOMPUTERSHELLVIEWCOLUMNS
)
758 psd
->fmt
= MyComputerSFHeader
[iColumn
].fmt
;
759 psd
->cxChar
= MyComputerSFHeader
[iColumn
].cxChar
;
760 psd
->str
.uType
= STRRET_CSTR
;
761 LoadStringA(shell32_hInstance
, MyComputerSFHeader
[iColumn
].colnameid
,
762 psd
->str
.cStr
, MAX_PATH
);
767 char szPath
[MAX_PATH
];
768 ULARGE_INTEGER ulBytes
;
770 psd
->str
.cStr
[0] = 0x00;
771 psd
->str
.uType
= STRRET_CSTR
;
775 hr
= GetDisplayNameOf(pidl
,
776 SHGDN_NORMAL
| SHGDN_INFOLDER
, &psd
->str
);
779 _ILGetFileType(pidl
, psd
->str
.cStr
, MAX_PATH
);
781 case 2: /* total size */
782 if (_ILIsDrive(pidl
))
784 _ILSimpleGetText (pidl
, szPath
, MAX_PATH
);
785 GetDiskFreeSpaceExA (szPath
, NULL
, &ulBytes
, NULL
);
786 StrFormatByteSizeA (ulBytes
.LowPart
, psd
->str
.cStr
, MAX_PATH
);
789 case 3: /* free size */
790 if (_ILIsDrive(pidl
))
792 _ILSimpleGetText (pidl
, szPath
, MAX_PATH
);
793 GetDiskFreeSpaceExA (szPath
, &ulBytes
, NULL
, NULL
);
794 StrFormatByteSizeA (ulBytes
.LowPart
, psd
->str
.cStr
, MAX_PATH
);
804 HRESULT WINAPI
CDrivesFolder::MapColumnToSCID(UINT column
, SHCOLUMNID
* pscid
)
806 FIXME("(%p)\n", this);
810 /************************************************************************
811 * CDrivesFolder::GetClassID
813 HRESULT WINAPI
CDrivesFolder::GetClassID(CLSID
*lpClassId
)
815 TRACE ("(%p)\n", this);
820 *lpClassId
= CLSID_MyComputer
;
824 /************************************************************************
825 * CDrivesFolder::Initialize
827 * NOTES: it makes no sense to change the pidl
829 HRESULT WINAPI
CDrivesFolder::Initialize(LPCITEMIDLIST pidl
)
831 TRACE ("(%p)->(%p)\n", this, pidl
);
834 SHFree((LPVOID
)pidlRoot
);
836 pidlRoot
= ILClone(pidl
);
840 /**************************************************************************
841 * CDrivesFolder::GetCurFolder
843 HRESULT WINAPI
CDrivesFolder::GetCurFolder(LPITEMIDLIST
*pidl
)
845 TRACE("(%p)->(%p)\n", this, pidl
);
850 *pidl
= ILClone(pidlRoot
);