2 * Virtual Admin Tools Folder
4 * Copyright 2008 Johannes Anderwald
5 * Copyright 2009 Andrew Hill
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 WINE_DEFAULT_DEBUG_CHANNEL (shell
);
26 CAdminToolsFolder::CAdminToolsFolder()
31 CAdminToolsFolder::~CAdminToolsFolder()
37 HRESULT WINAPI
CAdminToolsFolder::ParseDisplayName(HWND hwndOwner
, LPBC pbc
, LPOLESTR lpszDisplayName
,
38 ULONG
*pchEaten
, PIDLIST_RELATIVE
*ppidl
, ULONG
*pdwAttributes
)
40 return m_pisfInner
->ParseDisplayName(hwndOwner
, pbc
, lpszDisplayName
, pchEaten
, ppidl
, pdwAttributes
);
43 HRESULT WINAPI
CAdminToolsFolder::EnumObjects(HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
)
45 return m_pisfInner
->EnumObjects(hwndOwner
, dwFlags
, ppEnumIDList
);
48 HRESULT WINAPI
CAdminToolsFolder::BindToObject(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
50 return m_pisfInner
->BindToObject(pidl
, pbcReserved
, riid
, ppvOut
);
53 HRESULT WINAPI
CAdminToolsFolder::BindToStorage(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
55 return m_pisfInner
->BindToStorage(pidl
, pbcReserved
, riid
, ppvOut
);
58 HRESULT WINAPI
CAdminToolsFolder::CompareIDs(LPARAM lParam
, PCUIDLIST_RELATIVE pidl1
, PCUIDLIST_RELATIVE pidl2
)
60 return m_pisfInner
->CompareIDs(lParam
, pidl1
, pidl2
);
63 HRESULT WINAPI
CAdminToolsFolder::CreateViewObject(HWND hwndOwner
, REFIID riid
, LPVOID
*ppvOut
)
65 return m_pisfInner
->CreateViewObject(hwndOwner
, riid
, ppvOut
);
68 HRESULT WINAPI
CAdminToolsFolder::GetAttributesOf(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
*rgfInOut
)
70 static const DWORD dwAdminToolsAttributes
=
71 SFGAO_STORAGE
| SFGAO_STORAGEANCESTOR
| SFGAO_FILESYSANCESTOR
|
72 SFGAO_FOLDER
| SFGAO_FILESYSTEM
| SFGAO_HASSUBFOLDER
;
75 return m_pisfInner
->GetAttributesOf(cidl
, apidl
, rgfInOut
);
77 if (!rgfInOut
|| !apidl
)
83 *rgfInOut
&= dwAdminToolsAttributes
;
85 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
86 *rgfInOut
&= ~SFGAO_VALIDATE
;
91 HRESULT WINAPI
CAdminToolsFolder::GetUIObjectOf(HWND hwndOwner
, UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
,
92 REFIID riid
, UINT
* prgfInOut
, LPVOID
* ppvOut
)
94 return m_pisfInner
->GetUIObjectOf(hwndOwner
, cidl
, apidl
, riid
, prgfInOut
, ppvOut
);
97 HRESULT WINAPI
CAdminToolsFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET strRet
)
102 /* If we got an fs item just forward to the fs folder */
103 if (!_ILIsSpecialFolder(pidl
))
104 return m_pisfInner
->GetDisplayNameOf(pidl
, dwFlags
, strRet
);
106 /* The caller wants our path. Let fs folder handle it */
107 if ((GET_SHGDN_RELATION (dwFlags
) == SHGDN_NORMAL
) &&
108 (GET_SHGDN_FOR (dwFlags
) & SHGDN_FORPARSING
))
110 /* Give an empty pidl to the fs folder to make it tell us its path */
112 pidl
= ILGetNext(pidl
);
113 return m_pisfInner
->GetDisplayNameOf(pidl
, dwFlags
, strRet
);
116 ERR("Got empty pidl without SHGDN_FORPARSING\n");
120 HRESULT WINAPI
CAdminToolsFolder::SetNameOf(HWND hwndOwner
, PCUITEMID_CHILD pidl
, /* simple pidl */
121 LPCOLESTR lpName
, DWORD dwFlags
, PITEMID_CHILD
*pPidlOut
)
123 return m_pisfInner
->SetNameOf(hwndOwner
, pidl
, lpName
, dwFlags
, pPidlOut
);
126 HRESULT WINAPI
CAdminToolsFolder::GetDefaultSearchGUID(GUID
*pguid
)
128 return m_pisfInner
->GetDefaultSearchGUID(pguid
);
131 HRESULT WINAPI
CAdminToolsFolder::EnumSearches(IEnumExtraSearch
** ppenum
)
133 return m_pisfInner
->EnumSearches(ppenum
);
136 HRESULT WINAPI
CAdminToolsFolder::GetDefaultColumn(DWORD dwRes
, ULONG
*pSort
, ULONG
*pDisplay
)
138 return m_pisfInner
->GetDefaultColumn(dwRes
, pSort
, pDisplay
);
141 HRESULT WINAPI
CAdminToolsFolder::GetDefaultColumnState(UINT iColumn
, DWORD
*pcsFlags
)
143 return m_pisfInner
->GetDefaultColumnState(iColumn
, pcsFlags
);
146 HRESULT WINAPI
CAdminToolsFolder::GetDetailsEx(PCUITEMID_CHILD pidl
, const SHCOLUMNID
*pscid
, VARIANT
*pv
)
148 return m_pisfInner
->GetDetailsEx(pidl
, pscid
, pv
);
151 HRESULT WINAPI
CAdminToolsFolder::GetDetailsOf(PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
*psd
)
153 return m_pisfInner
->GetDetailsOf(pidl
, iColumn
, psd
);
156 HRESULT WINAPI
CAdminToolsFolder::MapColumnToSCID(UINT column
, SHCOLUMNID
*pscid
)
158 return m_pisfInner
->MapColumnToSCID(column
, pscid
);
161 HRESULT WINAPI
CAdminToolsFolder::GetClassID(CLSID
*lpClassId
)
166 memcpy(lpClassId
, &CLSID_AdminFolderShortcut
, sizeof(CLSID
));
171 HRESULT WINAPI
CAdminToolsFolder::Initialize(LPCITEMIDLIST pidl
)
173 m_pidlInner
= ILClone(pidl
);
175 return E_OUTOFMEMORY
;
177 return SHELL32_CoCreateInitSF(m_pidlInner
,
178 &CLSID_ShellFSFolder
,
179 CSIDL_COMMON_ADMINTOOLS
,
180 IID_PPV_ARG(IShellFolder2
, &m_pisfInner
));
183 HRESULT WINAPI
CAdminToolsFolder::GetCurFolder(LPITEMIDLIST
*pidl
)
187 *pidl
= ILClone(m_pidlInner
);