1c2c66affSColin Finck /* 2c2c66affSColin Finck * Control panel folder 3c2c66affSColin Finck * 4c2c66affSColin Finck * Copyright 2003 Martin Fuchs 5c2c66affSColin Finck * Copyright 2009 Andrew Hill 6c2c66affSColin Finck * 7c2c66affSColin Finck * This library is free software; you can redistribute it and/or 8c2c66affSColin Finck * modify it under the terms of the GNU Lesser General Public 9c2c66affSColin Finck * License as published by the Free Software Foundation; either 10c2c66affSColin Finck * version 2.1 of the License, or (at your option) any later version. 11c2c66affSColin Finck * 12c2c66affSColin Finck * This library is distributed in the hope that it will be useful, 13c2c66affSColin Finck * but WITHOUT ANY WARRANTY; without even the implied warranty of 14c2c66affSColin Finck * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15c2c66affSColin Finck * Lesser General Public License for more details. 16c2c66affSColin Finck * 17c2c66affSColin Finck * You should have received a copy of the GNU Lesser General Public 18c2c66affSColin Finck * License along with this library; if not, write to the Free Software 19c2c66affSColin Finck * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 20c2c66affSColin Finck */ 21c2c66affSColin Finck 22c2c66affSColin Finck #include <precomp.h> 23c2c66affSColin Finck 24c2c66affSColin Finck WINE_DEFAULT_DEBUG_CHANNEL(shell); 25c2c66affSColin Finck 26c2c66affSColin Finck /*********************************************************************** 27c2c66affSColin Finck * control panel implementation in shell namespace 28c2c66affSColin Finck */ 29c2c66affSColin Finck 30c2c66affSColin Finck class CControlPanelEnum : 31c2c66affSColin Finck public CEnumIDListBase 32c2c66affSColin Finck { 33c2c66affSColin Finck public: 34c2c66affSColin Finck CControlPanelEnum(); 35c2c66affSColin Finck ~CControlPanelEnum(); 36c2c66affSColin Finck HRESULT WINAPI Initialize(DWORD dwFlags, IEnumIDList* pRegEnumerator); 37c2c66affSColin Finck BOOL RegisterCPanelApp(LPCWSTR path); 38c2c66affSColin Finck int RegisterRegistryCPanelApps(HKEY hkey_root, LPCWSTR szRepPath); 39c2c66affSColin Finck BOOL CreateCPanelEnumList(DWORD dwFlags); 40c2c66affSColin Finck 41c2c66affSColin Finck BEGIN_COM_MAP(CControlPanelEnum) 42c2c66affSColin Finck COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList) 43c2c66affSColin Finck END_COM_MAP() 44c2c66affSColin Finck }; 45c2c66affSColin Finck 46c2c66affSColin Finck /*********************************************************************** 47c2c66affSColin Finck * IShellFolder [ControlPanel] implementation 48c2c66affSColin Finck */ 49c2c66affSColin Finck 50c2c66affSColin Finck static const shvheader ControlPanelSFHeader[] = { 51c2c66affSColin Finck {IDS_SHV_COLUMN_NAME, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 20},/*FIXME*/ 52c2c66affSColin Finck {IDS_SHV_COLUMN_COMMENTS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 80},/*FIXME*/ 53c2c66affSColin Finck }; 54c2c66affSColin Finck 55*4c25af5bSMuthu R Kumar enum controlpanel_columns 56*4c25af5bSMuthu R Kumar { 57*4c25af5bSMuthu R Kumar CONTROLPANEL_COL_NAME, 58*4c25af5bSMuthu R Kumar CONTROLPANEL_COL_COMMENT, 59*4c25af5bSMuthu R Kumar CONTROLPANEL_COL_COUNT, 60*4c25af5bSMuthu R Kumar }; 61c2c66affSColin Finck 62c2c66affSColin Finck CControlPanelEnum::CControlPanelEnum() 63c2c66affSColin Finck { 64c2c66affSColin Finck } 65c2c66affSColin Finck 66c2c66affSColin Finck CControlPanelEnum::~CControlPanelEnum() 67c2c66affSColin Finck { 68c2c66affSColin Finck } 69c2c66affSColin Finck 70c2c66affSColin Finck HRESULT WINAPI CControlPanelEnum::Initialize(DWORD dwFlags, IEnumIDList* pRegEnumerator) 71c2c66affSColin Finck { 72c2c66affSColin Finck if (CreateCPanelEnumList(dwFlags) == FALSE) 73c2c66affSColin Finck return E_FAIL; 74c2c66affSColin Finck AppendItemsFromEnumerator(pRegEnumerator); 75c2c66affSColin Finck return S_OK; 76c2c66affSColin Finck } 77c2c66affSColin Finck 78c2c66affSColin Finck static LPITEMIDLIST _ILCreateCPanelApplet(LPCWSTR pszName, LPCWSTR pszDisplayName, LPCWSTR pszComment, int iIconIdx) 79c2c66affSColin Finck { 80c2c66affSColin Finck PIDLCPanelStruct *pCP; 81c2c66affSColin Finck LPITEMIDLIST pidl; 82c2c66affSColin Finck LPPIDLDATA pData; 83c2c66affSColin Finck int cchName, cchDisplayName, cchComment, cbData; 84c2c66affSColin Finck 85c2c66affSColin Finck /* Calculate lengths of given strings */ 86c2c66affSColin Finck cchName = wcslen(pszName); 87c2c66affSColin Finck cchDisplayName = wcslen(pszDisplayName); 88c2c66affSColin Finck cchComment = wcslen(pszComment); 89c2c66affSColin Finck 90c2c66affSColin Finck /* Allocate PIDL */ 91c2c66affSColin Finck cbData = sizeof(pidl->mkid.cb) + sizeof(pData->type) + sizeof(pData->u.cpanel) - sizeof(pData->u.cpanel.szName) 92c2c66affSColin Finck + (cchName + cchDisplayName + cchComment + 3) * sizeof(WCHAR); 93c2c66affSColin Finck pidl = (LPITEMIDLIST)SHAlloc(cbData + sizeof(WORD)); 94c2c66affSColin Finck if (!pidl) 95c2c66affSColin Finck return NULL; 96c2c66affSColin Finck 97c2c66affSColin Finck /* Copy data to allocated memory */ 98c2c66affSColin Finck pidl->mkid.cb = cbData; 99c2c66affSColin Finck pData = (PIDLDATA *)pidl->mkid.abID; 100c2c66affSColin Finck pData->type = PT_CPLAPPLET; 101c2c66affSColin Finck 102c2c66affSColin Finck pCP = &pData->u.cpanel; 103c2c66affSColin Finck pCP->dummy = 0; 104c2c66affSColin Finck pCP->iconIdx = iIconIdx; 105c2c66affSColin Finck wcscpy(pCP->szName, pszName); 106c2c66affSColin Finck pCP->offsDispName = cchName + 1; 107c2c66affSColin Finck wcscpy(pCP->szName + pCP->offsDispName, pszDisplayName); 108c2c66affSColin Finck pCP->offsComment = pCP->offsDispName + cchDisplayName + 1; 109c2c66affSColin Finck wcscpy(pCP->szName + pCP->offsComment, pszComment); 110c2c66affSColin Finck 111c2c66affSColin Finck /* Add PIDL NULL terminator */ 112c2c66affSColin Finck *(WORD*)(pCP->szName + pCP->offsComment + cchComment + 1) = 0; 113c2c66affSColin Finck 114c2c66affSColin Finck pcheck(pidl); 115c2c66affSColin Finck 116c2c66affSColin Finck return pidl; 117c2c66affSColin Finck } 118c2c66affSColin Finck 119c2c66affSColin Finck /************************************************************************** 120c2c66affSColin Finck * _ILGetCPanelPointer() 121c2c66affSColin Finck * gets a pointer to the control panel struct stored in the pidl 122c2c66affSColin Finck */ 123c2c66affSColin Finck static PIDLCPanelStruct *_ILGetCPanelPointer(LPCITEMIDLIST pidl) 124c2c66affSColin Finck { 125c2c66affSColin Finck LPPIDLDATA pdata = _ILGetDataPointer(pidl); 126c2c66affSColin Finck 127c2c66affSColin Finck if (pdata && pdata->type == PT_CPLAPPLET) 128c2c66affSColin Finck return (PIDLCPanelStruct *) & (pdata->u.cpanel); 129c2c66affSColin Finck 130c2c66affSColin Finck return NULL; 131c2c66affSColin Finck } 132c2c66affSColin Finck 133c2c66affSColin Finck HRESULT CCPLExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST pidl, REFIID riid, LPVOID * ppvOut) 134c2c66affSColin Finck { 135c2c66affSColin Finck PIDLCPanelStruct *pData = _ILGetCPanelPointer(pidl); 136c2c66affSColin Finck if (!pData) 137c2c66affSColin Finck return E_FAIL; 138c2c66affSColin Finck 139c2c66affSColin Finck CComPtr<IDefaultExtractIconInit> initIcon; 140c2c66affSColin Finck HRESULT hr = SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit, &initIcon)); 141c2c66affSColin Finck if (FAILED_UNEXPECTEDLY(hr)) 142c2c66affSColin Finck return hr; 143c2c66affSColin Finck 144c2c66affSColin Finck initIcon->SetNormalIcon(pData->szName, (int)pData->iconIdx != -1 ? pData->iconIdx : 0); 145c2c66affSColin Finck 146c2c66affSColin Finck return initIcon->QueryInterface(riid, ppvOut); 147c2c66affSColin Finck } 148c2c66affSColin Finck 149c2c66affSColin Finck BOOL CControlPanelEnum::RegisterCPanelApp(LPCWSTR wpath) 150c2c66affSColin Finck { 151c2c66affSColin Finck CPlApplet* applet = Control_LoadApplet(0, wpath, NULL); 152c2c66affSColin Finck int iconIdx; 153c2c66affSColin Finck 154c2c66affSColin Finck if (applet) 155c2c66affSColin Finck { 156c2c66affSColin Finck for (UINT i = 0; i < applet->count; ++i) 157c2c66affSColin Finck { 158c2c66affSColin Finck if (applet->info[i].idIcon > 0) 159c2c66affSColin Finck iconIdx = -applet->info[i].idIcon; /* negative icon index instead of icon number */ 160c2c66affSColin Finck else 161c2c66affSColin Finck iconIdx = 0; 162c2c66affSColin Finck 163c2c66affSColin Finck LPITEMIDLIST pidl = _ILCreateCPanelApplet(wpath, 164c2c66affSColin Finck applet->info[i].name, 165c2c66affSColin Finck applet->info[i].info, 166c2c66affSColin Finck iconIdx); 167c2c66affSColin Finck 168c2c66affSColin Finck if (pidl) 169c2c66affSColin Finck AddToEnumList(pidl); 170c2c66affSColin Finck } 171c2c66affSColin Finck Control_UnloadApplet(applet); 172c2c66affSColin Finck } 173c2c66affSColin Finck return TRUE; 174c2c66affSColin Finck } 175c2c66affSColin Finck 176c2c66affSColin Finck int CControlPanelEnum::RegisterRegistryCPanelApps(HKEY hkey_root, LPCWSTR szRepPath) 177c2c66affSColin Finck { 178c2c66affSColin Finck WCHAR name[MAX_PATH]; 179c2c66affSColin Finck WCHAR value[MAX_PATH]; 180c2c66affSColin Finck HKEY hkey; 181c2c66affSColin Finck 182c2c66affSColin Finck int cnt = 0; 183c2c66affSColin Finck 184c2c66affSColin Finck if (RegOpenKeyW(hkey_root, szRepPath, &hkey) == ERROR_SUCCESS) 185c2c66affSColin Finck { 186c2c66affSColin Finck int idx = 0; 187c2c66affSColin Finck 188c2c66affSColin Finck for(; ; idx++) 189c2c66affSColin Finck { 190c2c66affSColin Finck DWORD nameLen = MAX_PATH; 191c2c66affSColin Finck DWORD valueLen = MAX_PATH; 192c2c66affSColin Finck WCHAR buffer[MAX_PATH]; 193c2c66affSColin Finck 194c2c66affSColin Finck if (RegEnumValueW(hkey, idx, name, &nameLen, NULL, NULL, (LPBYTE)&value, &valueLen) != ERROR_SUCCESS) 195c2c66affSColin Finck break; 196c2c66affSColin Finck 197c2c66affSColin Finck if (ExpandEnvironmentStringsW(value, buffer, MAX_PATH)) 198c2c66affSColin Finck { 199c2c66affSColin Finck wcscpy(value, buffer); 200c2c66affSColin Finck } 201c2c66affSColin Finck 202c2c66affSColin Finck if (RegisterCPanelApp(value)) 203c2c66affSColin Finck ++cnt; 204c2c66affSColin Finck } 205c2c66affSColin Finck RegCloseKey(hkey); 206c2c66affSColin Finck } 207c2c66affSColin Finck 208c2c66affSColin Finck return cnt; 209c2c66affSColin Finck } 210c2c66affSColin Finck 211c2c66affSColin Finck /************************************************************************** 212c2c66affSColin Finck * CControlPanelEnum::CreateCPanelEnumList() 213c2c66affSColin Finck */ 214c2c66affSColin Finck BOOL CControlPanelEnum::CreateCPanelEnumList(DWORD dwFlags) 215c2c66affSColin Finck { 216c2c66affSColin Finck WCHAR szPath[MAX_PATH]; 217c2c66affSColin Finck WIN32_FIND_DATAW wfd; 218c2c66affSColin Finck HANDLE hFile; 219c2c66affSColin Finck 220c2c66affSColin Finck TRACE("(%p)->(flags=0x%08x)\n", this, dwFlags); 221c2c66affSColin Finck 222c2c66affSColin Finck /* enumerate the control panel applets */ 223c2c66affSColin Finck if (dwFlags & SHCONTF_NONFOLDERS) 224c2c66affSColin Finck { 225c2c66affSColin Finck LPWSTR p; 226c2c66affSColin Finck 227c2c66affSColin Finck GetSystemDirectoryW(szPath, MAX_PATH); 228c2c66affSColin Finck p = PathAddBackslashW(szPath); 229c2c66affSColin Finck wcscpy(p, L"*.cpl"); 230c2c66affSColin Finck 231c2c66affSColin Finck hFile = FindFirstFileW(szPath, &wfd); 232c2c66affSColin Finck 233c2c66affSColin Finck if (hFile != INVALID_HANDLE_VALUE) 234c2c66affSColin Finck { 235c2c66affSColin Finck do 236c2c66affSColin Finck { 237c2c66affSColin Finck if (!(dwFlags & SHCONTF_INCLUDEHIDDEN) && (wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) 238c2c66affSColin Finck continue; 239c2c66affSColin Finck 240c2c66affSColin Finck if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { 241c2c66affSColin Finck wcscpy(p, wfd.cFileName); 242c2c66affSColin Finck if (wcscmp(wfd.cFileName, L"ncpa.cpl")) 243c2c66affSColin Finck RegisterCPanelApp(szPath); 244c2c66affSColin Finck } 245c2c66affSColin Finck } while(FindNextFileW(hFile, &wfd)); 246c2c66affSColin Finck FindClose(hFile); 247c2c66affSColin Finck } 248c2c66affSColin Finck 249c2c66affSColin Finck RegisterRegistryCPanelApps(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls"); 250c2c66affSColin Finck RegisterRegistryCPanelApps(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls"); 251c2c66affSColin Finck } 252c2c66affSColin Finck return TRUE; 253c2c66affSColin Finck } 254c2c66affSColin Finck 255c2c66affSColin Finck CControlPanelFolder::CControlPanelFolder() 256c2c66affSColin Finck { 257c2c66affSColin Finck pidlRoot = NULL; /* absolute pidl */ 258c2c66affSColin Finck } 259c2c66affSColin Finck 260c2c66affSColin Finck CControlPanelFolder::~CControlPanelFolder() 261c2c66affSColin Finck { 262c2c66affSColin Finck TRACE("-- destroying IShellFolder(%p)\n", this); 263c2c66affSColin Finck SHFree(pidlRoot); 264c2c66affSColin Finck } 265c2c66affSColin Finck 266c2c66affSColin Finck /************************************************************************** 267c2c66affSColin Finck * CControlPanelFolder::ParseDisplayName 268c2c66affSColin Finck */ 269c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::ParseDisplayName( 270c2c66affSColin Finck HWND hwndOwner, 271c2c66affSColin Finck LPBC pbc, 272c2c66affSColin Finck LPOLESTR lpszDisplayName, 273c2c66affSColin Finck DWORD *pchEaten, 274c2c66affSColin Finck PIDLIST_RELATIVE *ppidl, 275c2c66affSColin Finck DWORD *pdwAttributes) 276c2c66affSColin Finck { 277c2c66affSColin Finck /* We only support parsing guid names */ 278c2c66affSColin Finck return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl, pdwAttributes); 279c2c66affSColin Finck } 280c2c66affSColin Finck 281c2c66affSColin Finck /************************************************************************** 282c2c66affSColin Finck * CControlPanelFolder::EnumObjects 283c2c66affSColin Finck */ 284c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) 285c2c66affSColin Finck { 286c2c66affSColin Finck CComPtr<IEnumIDList> pRegEnumerator; 287c2c66affSColin Finck m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator); 288c2c66affSColin Finck 289c2c66affSColin Finck return ShellObjectCreatorInit<CControlPanelEnum>(dwFlags, pRegEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList)); 290c2c66affSColin Finck } 291c2c66affSColin Finck 292c2c66affSColin Finck /************************************************************************** 293c2c66affSColin Finck * CControlPanelFolder::BindToObject 294c2c66affSColin Finck */ 295c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::BindToObject( 296c2c66affSColin Finck PCUIDLIST_RELATIVE pidl, 297c2c66affSColin Finck LPBC pbcReserved, 298c2c66affSColin Finck REFIID riid, 299c2c66affSColin Finck LPVOID *ppvOut) 300c2c66affSColin Finck { 301c2c66affSColin Finck return m_regFolder->BindToObject(pidl, pbcReserved, riid, ppvOut); 302c2c66affSColin Finck } 303c2c66affSColin Finck 304c2c66affSColin Finck /************************************************************************** 305c2c66affSColin Finck * CControlPanelFolder::BindToStorage 306c2c66affSColin Finck */ 307c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::BindToStorage( 308c2c66affSColin Finck PCUIDLIST_RELATIVE pidl, 309c2c66affSColin Finck LPBC pbcReserved, 310c2c66affSColin Finck REFIID riid, 311c2c66affSColin Finck LPVOID *ppvOut) 312c2c66affSColin Finck { 313c2c66affSColin Finck FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this, pidl, pbcReserved, shdebugstr_guid(&riid), ppvOut); 314c2c66affSColin Finck 315c2c66affSColin Finck *ppvOut = NULL; 316c2c66affSColin Finck return E_NOTIMPL; 317c2c66affSColin Finck } 318c2c66affSColin Finck 319c2c66affSColin Finck /************************************************************************** 320c2c66affSColin Finck * CControlPanelFolder::CompareIDs 321c2c66affSColin Finck */ 322c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) 323c2c66affSColin Finck { 324c2c66affSColin Finck /* Dont use SHELL32_CompareGuidItems because it would cause guid items to come first */ 325c2c66affSColin Finck if (_ILIsSpecialFolder(pidl1) || _ILIsSpecialFolder(pidl2)) 326c2c66affSColin Finck { 327c2c66affSColin Finck return SHELL32_CompareDetails(this, lParam, pidl1, pidl2); 328c2c66affSColin Finck } 329c2c66affSColin Finck PIDLCPanelStruct *pData1 = _ILGetCPanelPointer(pidl1); 330c2c66affSColin Finck PIDLCPanelStruct *pData2 = _ILGetCPanelPointer(pidl2); 331c2c66affSColin Finck 332*4c25af5bSMuthu R Kumar if (!pData1 || !pData2 || LOWORD(lParam) >= CONTROLPANEL_COL_COUNT) 333c2c66affSColin Finck return E_INVALIDARG; 334c2c66affSColin Finck 335c2c66affSColin Finck int result; 336c2c66affSColin Finck switch(LOWORD(lParam)) 337c2c66affSColin Finck { 338*4c25af5bSMuthu R Kumar case CONTROLPANEL_COL_NAME: 339c2c66affSColin Finck result = wcsicmp(pData1->szName + pData1->offsDispName, pData2->szName + pData2->offsDispName); 340c2c66affSColin Finck break; 341*4c25af5bSMuthu R Kumar case CONTROLPANEL_COL_COMMENT: 342c2c66affSColin Finck result = wcsicmp(pData1->szName + pData1->offsComment, pData2->szName + pData2->offsComment); 343c2c66affSColin Finck break; 344c2c66affSColin Finck default: 345c2c66affSColin Finck ERR("Got wrong lParam!\n"); 346c2c66affSColin Finck return E_INVALIDARG; 347c2c66affSColin Finck } 348c2c66affSColin Finck 349c2c66affSColin Finck return MAKE_COMPARE_HRESULT(result); 350c2c66affSColin Finck } 351c2c66affSColin Finck 352c2c66affSColin Finck /************************************************************************** 353c2c66affSColin Finck * CControlPanelFolder::CreateViewObject 354c2c66affSColin Finck */ 355c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID * ppvOut) 356c2c66affSColin Finck { 357c2c66affSColin Finck CComPtr<IShellView> pShellView; 358c2c66affSColin Finck HRESULT hr = E_INVALIDARG; 359c2c66affSColin Finck 360c2c66affSColin Finck TRACE("(%p)->(hwnd=%p,%s,%p)\n", this, hwndOwner, shdebugstr_guid(&riid), ppvOut); 361c2c66affSColin Finck 362c2c66affSColin Finck if (ppvOut) { 363c2c66affSColin Finck *ppvOut = NULL; 364c2c66affSColin Finck 365c2c66affSColin Finck if (IsEqualIID(riid, IID_IDropTarget)) { 366c2c66affSColin Finck WARN("IDropTarget not implemented\n"); 367c2c66affSColin Finck hr = E_NOTIMPL; 368c2c66affSColin Finck } else if (IsEqualIID(riid, IID_IContextMenu)) { 369c2c66affSColin Finck WARN("IContextMenu not implemented\n"); 370c2c66affSColin Finck hr = E_NOTIMPL; 371c2c66affSColin Finck } else if (IsEqualIID(riid, IID_IShellView)) { 372c2c66affSColin Finck SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this}; 373c2c66affSColin Finck hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut); 374c2c66affSColin Finck } 375c2c66affSColin Finck } 376c2c66affSColin Finck TRACE("--(%p)->(interface=%p)\n", this, ppvOut); 377c2c66affSColin Finck return hr; 378c2c66affSColin Finck } 379c2c66affSColin Finck 380c2c66affSColin Finck /************************************************************************** 381c2c66affSColin Finck * CControlPanelFolder::GetAttributesOf 382c2c66affSColin Finck */ 383c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD * rgfInOut) 384c2c66affSColin Finck { 385c2c66affSColin Finck HRESULT hr = S_OK; 386c2c66affSColin Finck static const DWORD dwControlPanelAttributes = 387c2c66affSColin Finck SFGAO_HASSUBFOLDER | SFGAO_FOLDER | SFGAO_CANLINK; 388c2c66affSColin Finck 389c2c66affSColin Finck TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n", 390c2c66affSColin Finck this, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0); 391c2c66affSColin Finck 392c2c66affSColin Finck if (!rgfInOut) 393c2c66affSColin Finck return E_INVALIDARG; 394c2c66affSColin Finck if (cidl && !apidl) 395c2c66affSColin Finck return E_INVALIDARG; 396c2c66affSColin Finck 397c2c66affSColin Finck if (*rgfInOut == 0) 398c2c66affSColin Finck *rgfInOut = ~0; 399c2c66affSColin Finck 400c2c66affSColin Finck if (!cidl) 401c2c66affSColin Finck { 402c2c66affSColin Finck *rgfInOut &= dwControlPanelAttributes; 403c2c66affSColin Finck } 404c2c66affSColin Finck else 405c2c66affSColin Finck { 406c2c66affSColin Finck while(cidl > 0 && *apidl) 407c2c66affSColin Finck { 408c2c66affSColin Finck pdump(*apidl); 409c2c66affSColin Finck if (_ILIsCPanelStruct(*apidl)) 410c2c66affSColin Finck *rgfInOut &= SFGAO_CANLINK; 411c2c66affSColin Finck else if (_ILIsSpecialFolder(*apidl)) 412c2c66affSColin Finck m_regFolder->GetAttributesOf(1, apidl, rgfInOut); 413c2c66affSColin Finck else 414c2c66affSColin Finck ERR("Got an unkown pidl here!\n"); 415c2c66affSColin Finck apidl++; 416c2c66affSColin Finck cidl--; 417c2c66affSColin Finck } 418c2c66affSColin Finck } 419c2c66affSColin Finck /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ 420c2c66affSColin Finck *rgfInOut &= ~SFGAO_VALIDATE; 421c2c66affSColin Finck 422c2c66affSColin Finck TRACE("-- result=0x%08x\n", *rgfInOut); 423c2c66affSColin Finck return hr; 424c2c66affSColin Finck } 425c2c66affSColin Finck 426c2c66affSColin Finck /************************************************************************** 427c2c66affSColin Finck * CControlPanelFolder::GetUIObjectOf 428c2c66affSColin Finck * 429c2c66affSColin Finck * PARAMETERS 430c2c66affSColin Finck * HWND hwndOwner, //[in ] Parent window for any output 431c2c66affSColin Finck * UINT cidl, //[in ] array size 432c2c66affSColin Finck * LPCITEMIDLIST* apidl, //[in ] simple pidl array 433c2c66affSColin Finck * REFIID riid, //[in ] Requested Interface 434c2c66affSColin Finck * UINT* prgfInOut, //[ ] reserved 435c2c66affSColin Finck * LPVOID* ppvObject) //[out] Resulting Interface 436c2c66affSColin Finck * 437c2c66affSColin Finck */ 438c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::GetUIObjectOf(HWND hwndOwner, 439c2c66affSColin Finck UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) 440c2c66affSColin Finck { 441c2c66affSColin Finck LPVOID pObj = NULL; 442c2c66affSColin Finck HRESULT hr = E_INVALIDARG; 443c2c66affSColin Finck 444c2c66affSColin Finck TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", 445c2c66affSColin Finck this, hwndOwner, cidl, apidl, shdebugstr_guid(&riid), prgfInOut, ppvOut); 446c2c66affSColin Finck 447c2c66affSColin Finck if (ppvOut) { 448c2c66affSColin Finck *ppvOut = NULL; 449c2c66affSColin Finck 450c2c66affSColin Finck if (IsEqualIID(riid, IID_IContextMenu) && (cidl >= 1)) { 451c2c66affSColin Finck 452c2c66affSColin Finck /* HACK: We should use callbacks from CDefaultContextMenu instead of creating one on our own */ 453c2c66affSColin Finck BOOL bHasCpl = FALSE; 454c2c66affSColin Finck for (UINT i = 0; i < cidl; i++) 455c2c66affSColin Finck { 456c2c66affSColin Finck if(_ILIsCPanelStruct(apidl[i])) 457c2c66affSColin Finck { 458c2c66affSColin Finck bHasCpl = TRUE; 459c2c66affSColin Finck } 460c2c66affSColin Finck } 461c2c66affSColin Finck 462c2c66affSColin Finck if (bHasCpl) 463c2c66affSColin Finck hr = ShellObjectCreatorInit<CCPLItemMenu>(cidl, apidl, riid, &pObj); 464c2c66affSColin Finck else 465c2c66affSColin Finck hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj); 466c2c66affSColin Finck } else if (IsEqualIID(riid, IID_IDataObject) && (cidl >= 1)) { 467c3132711SMark Jansen hr = IDataObject_Constructor(hwndOwner, pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj); 468c2c66affSColin Finck } else if ((IsEqualIID(riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && (cidl == 1)) { 469c2c66affSColin Finck if (_ILGetCPanelPointer(apidl[0])) 470c2c66affSColin Finck hr = CCPLExtractIcon_CreateInstance(this, apidl[0], riid, &pObj); 471c2c66affSColin Finck else 472c2c66affSColin Finck hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj); 473c2c66affSColin Finck } else { 474c2c66affSColin Finck hr = E_NOINTERFACE; 475c2c66affSColin Finck } 476c2c66affSColin Finck 477c2c66affSColin Finck if (SUCCEEDED(hr) && !pObj) 478c2c66affSColin Finck hr = E_OUTOFMEMORY; 479c2c66affSColin Finck 480c2c66affSColin Finck *ppvOut = pObj; 481c2c66affSColin Finck } 482c2c66affSColin Finck TRACE("(%p)->hr=0x%08x\n", this, hr); 483c2c66affSColin Finck return hr; 484c2c66affSColin Finck } 485c2c66affSColin Finck 486c2c66affSColin Finck /************************************************************************** 487c2c66affSColin Finck * CControlPanelFolder::GetDisplayNameOf 488c2c66affSColin Finck */ 489c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) 490c2c66affSColin Finck { 491c2c66affSColin Finck if (!pidl) 492c2c66affSColin Finck return S_FALSE; 493c2c66affSColin Finck 494c2c66affSColin Finck PIDLCPanelStruct *pCPanel = _ILGetCPanelPointer(pidl); 495c2c66affSColin Finck 496c2c66affSColin Finck if (pCPanel) 497c2c66affSColin Finck { 498c2c66affSColin Finck return SHSetStrRet(strRet, pCPanel->szName + pCPanel->offsDispName); 499c2c66affSColin Finck } 500c2c66affSColin Finck else if (_ILIsSpecialFolder(pidl)) 501c2c66affSColin Finck { 502c2c66affSColin Finck return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet); 503c2c66affSColin Finck } 504c2c66affSColin Finck 505c2c66affSColin Finck return E_FAIL; 506c2c66affSColin Finck } 507c2c66affSColin Finck 508c2c66affSColin Finck /************************************************************************** 509c2c66affSColin Finck * CControlPanelFolder::SetNameOf 510c2c66affSColin Finck * Changes the name of a file object or subfolder, possibly changing its item 511c2c66affSColin Finck * identifier in the process. 512c2c66affSColin Finck * 513c2c66affSColin Finck * PARAMETERS 514c2c66affSColin Finck * HWND hwndOwner, //[in ] Owner window for output 515c2c66affSColin Finck * LPCITEMIDLIST pidl, //[in ] simple pidl of item to change 516c2c66affSColin Finck * LPCOLESTR lpszName, //[in ] the items new display name 517c2c66affSColin Finck * DWORD dwFlags, //[in ] SHGNO formatting flags 518c2c66affSColin Finck * LPITEMIDLIST* ppidlOut) //[out] simple pidl returned 519c2c66affSColin Finck */ 520c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /*simple pidl */ 521c2c66affSColin Finck LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) 522c2c66affSColin Finck { 523c2c66affSColin Finck FIXME("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this, hwndOwner, pidl, debugstr_w(lpName), dwFlags, pPidlOut); 524c2c66affSColin Finck return E_FAIL; 525c2c66affSColin Finck } 526c2c66affSColin Finck 527c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::GetDefaultSearchGUID(GUID *pguid) 528c2c66affSColin Finck { 529c2c66affSColin Finck FIXME("(%p)\n", this); 530c2c66affSColin Finck return E_NOTIMPL; 531c2c66affSColin Finck } 532c2c66affSColin Finck 533c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::EnumSearches(IEnumExtraSearch **ppenum) 534c2c66affSColin Finck { 535c2c66affSColin Finck FIXME("(%p)\n", this); 536c2c66affSColin Finck return E_NOTIMPL; 537c2c66affSColin Finck } 538c2c66affSColin Finck 539c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) 540c2c66affSColin Finck { 541c2c66affSColin Finck TRACE("(%p)\n", this); 542c2c66affSColin Finck 543c2c66affSColin Finck if (pSort) *pSort = 0; 544c2c66affSColin Finck if (pDisplay) *pDisplay = 0; 545c2c66affSColin Finck return S_OK; 546c2c66affSColin Finck } 547c2c66affSColin Finck 548c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) 549c2c66affSColin Finck { 550c2c66affSColin Finck TRACE("(%p)\n", this); 551c2c66affSColin Finck 552*4c25af5bSMuthu R Kumar if (!pcsFlags || iColumn >= CONTROLPANEL_COL_COUNT) 553*4c25af5bSMuthu R Kumar return E_INVALIDARG; 554c2c66affSColin Finck *pcsFlags = ControlPanelSFHeader[iColumn].pcsFlags; 555c2c66affSColin Finck return S_OK; 556c2c66affSColin Finck } 557c2c66affSColin Finck 558c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) 559c2c66affSColin Finck { 560c2c66affSColin Finck FIXME("(%p)\n", this); 561c2c66affSColin Finck return E_NOTIMPL; 562c2c66affSColin Finck } 563c2c66affSColin Finck 564c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) 565c2c66affSColin Finck { 566*4c25af5bSMuthu R Kumar if (!psd || iColumn >= CONTROLPANEL_COL_COUNT) 567c2c66affSColin Finck return E_INVALIDARG; 568c2c66affSColin Finck 569c2c66affSColin Finck if (!pidl) 570c2c66affSColin Finck { 571c2c66affSColin Finck psd->fmt = ControlPanelSFHeader[iColumn].fmt; 572c2c66affSColin Finck psd->cxChar = ControlPanelSFHeader[iColumn].cxChar; 573c2c66affSColin Finck return SHSetStrRet(&psd->str, shell32_hInstance, ControlPanelSFHeader[iColumn].colnameid); 574c2c66affSColin Finck } 575c2c66affSColin Finck else if (_ILIsSpecialFolder(pidl)) 576c2c66affSColin Finck { 577c2c66affSColin Finck return m_regFolder->GetDetailsOf(pidl, iColumn, psd); 578c2c66affSColin Finck } 579c2c66affSColin Finck else 580c2c66affSColin Finck { 581c2c66affSColin Finck PIDLCPanelStruct *pCPanel = _ILGetCPanelPointer(pidl); 582c2c66affSColin Finck 583c2c66affSColin Finck if (!pCPanel) 584c2c66affSColin Finck return E_FAIL; 585c2c66affSColin Finck 586c2c66affSColin Finck switch(iColumn) 587c2c66affSColin Finck { 588*4c25af5bSMuthu R Kumar case CONTROLPANEL_COL_NAME: 589c2c66affSColin Finck return SHSetStrRet(&psd->str, pCPanel->szName + pCPanel->offsDispName); 590*4c25af5bSMuthu R Kumar case CONTROLPANEL_COL_COMMENT: 591c2c66affSColin Finck return SHSetStrRet(&psd->str, pCPanel->szName + pCPanel->offsComment); 592c2c66affSColin Finck } 593c2c66affSColin Finck } 594c2c66affSColin Finck 595*4c25af5bSMuthu R Kumar return E_FAIL; 596c2c66affSColin Finck } 597c2c66affSColin Finck 598c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::MapColumnToSCID(UINT column, SHCOLUMNID *pscid) 599c2c66affSColin Finck { 600c2c66affSColin Finck FIXME("(%p)\n", this); 601c2c66affSColin Finck return E_NOTIMPL; 602c2c66affSColin Finck } 603c2c66affSColin Finck 604c2c66affSColin Finck /************************************************************************ 605c2c66affSColin Finck * CControlPanelFolder::GetClassID 606c2c66affSColin Finck */ 607c2c66affSColin Finck HRESULT WINAPI CControlPanelFolder::GetClassID(CLSID *lpClassId) 608c2c66affSColin Finck { 609c2c66affSColin Finck TRACE("(%p)\n", this); 610c2c66affSColin Finck 611c2c66affSColin Finck if (!lpClassId) 612c2c66affSColin Finck return E_POINTER; 613c2c66affSColin Finck *lpClassId = CLSID_ControlPanel; 614c2c66affSColin Finck 615c2c66affSColin Finck return S_OK; 616c2c66affSColin Finck } 617c2c66affSColin Finck 618c2c66affSColin Finck /************************************************************************ 619c2c66affSColin Finck * CControlPanelFolder::Initialize 620c2c66affSColin Finck * 621c2c66affSColin Finck * NOTES: it makes no sense to change the pidl 622c2c66affSColin Finck */ 623c2b476bdSThomas Faber HRESULT WINAPI CControlPanelFolder::Initialize(PCIDLIST_ABSOLUTE pidl) 624c2c66affSColin Finck { 625c2c66affSColin Finck if (pidlRoot) 626c2c66affSColin Finck SHFree((LPVOID)pidlRoot); 627c2c66affSColin Finck 628c2c66affSColin Finck pidlRoot = ILClone(pidl); 629c2c66affSColin Finck 630c2c66affSColin Finck /* Create the inner reg folder */ 631c2c66affSColin Finck HRESULT hr; 632c2c66affSColin Finck hr = CRegFolder_CreateInstance(&CLSID_ControlPanel, 633c2c66affSColin Finck pidlRoot, 63483be315aSHermès Bélusca-Maïto L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}", 635c2c66affSColin Finck L"ControlPanel", 636c2c66affSColin Finck IID_PPV_ARG(IShellFolder2, &m_regFolder)); 637c2c66affSColin Finck if (FAILED_UNEXPECTEDLY(hr)) 638c2c66affSColin Finck return hr; 639c2c66affSColin Finck 640c2c66affSColin Finck return S_OK; 641c2c66affSColin Finck } 642c2c66affSColin Finck 643c2c66affSColin Finck /************************************************************************** 644c2c66affSColin Finck * CControlPanelFolder::GetCurFolder 645c2c66affSColin Finck */ 646b90c24d6SThomas Faber HRESULT WINAPI CControlPanelFolder::GetCurFolder(PIDLIST_ABSOLUTE * pidl) 647c2c66affSColin Finck { 648c2c66affSColin Finck TRACE("(%p)->(%p)\n", this, pidl); 649c2c66affSColin Finck 650c2c66affSColin Finck if (!pidl) 651c2c66affSColin Finck return E_POINTER; 652c2c66affSColin Finck *pidl = ILClone(pidlRoot); 653c2c66affSColin Finck return S_OK; 654c2c66affSColin Finck } 655c2c66affSColin Finck 656c2c66affSColin Finck CCPLItemMenu::CCPLItemMenu() 657c2c66affSColin Finck { 658c2c66affSColin Finck m_apidl = NULL; 659c2c66affSColin Finck m_cidl = 0; 660c2c66affSColin Finck } 661c2c66affSColin Finck 662c2c66affSColin Finck HRESULT WINAPI CCPLItemMenu::Initialize(UINT cidl, PCUITEMID_CHILD_ARRAY apidl) 663c2c66affSColin Finck { 664c2c66affSColin Finck m_cidl = cidl; 665c2c66affSColin Finck m_apidl = _ILCopyaPidl(apidl, m_cidl); 666c2c66affSColin Finck if (m_cidl && !m_apidl) 667c2c66affSColin Finck return E_OUTOFMEMORY; 668c2c66affSColin Finck 669c2c66affSColin Finck return S_OK; 670c2c66affSColin Finck } 671c2c66affSColin Finck 672c2c66affSColin Finck CCPLItemMenu::~CCPLItemMenu() 673c2c66affSColin Finck { 674c2c66affSColin Finck _ILFreeaPidl(m_apidl, m_cidl); 675c2c66affSColin Finck } 676c2c66affSColin Finck 677c2c66affSColin Finck HRESULT WINAPI CCPLItemMenu::QueryContextMenu( 678c2c66affSColin Finck HMENU hMenu, 679c2c66affSColin Finck UINT indexMenu, 680c2c66affSColin Finck UINT idCmdFirst, 681c2c66affSColin Finck UINT idCmdLast, 682c2c66affSColin Finck UINT uFlags) 683c2c66affSColin Finck { 68483335d3aSScott Maday _InsertMenuItemW(hMenu, indexMenu++, TRUE, idCmdFirst, MFT_STRING, MAKEINTRESOURCEW(IDS_OPEN), MFS_DEFAULT); 68583335d3aSScott Maday _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDC_STATIC, MFT_SEPARATOR, NULL, MFS_ENABLED); 68683335d3aSScott Maday _InsertMenuItemW(hMenu, indexMenu++, TRUE, idCmdFirst + 1, MFT_STRING, MAKEINTRESOURCEW(IDS_CREATELINK), MFS_ENABLED); 687c2c66affSColin Finck 688c2c66affSColin Finck return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 2); 689c2c66affSColin Finck } 690c2c66affSColin Finck 691c2c66affSColin Finck EXTERN_C 692c2c66affSColin Finck void WINAPI Control_RunDLLW(HWND hWnd, HINSTANCE hInst, LPCWSTR cmd, DWORD nCmdShow); 693c2c66affSColin Finck 694c2c66affSColin Finck /************************************************************************** 695c2c66affSColin Finck * ICPanel_IContextMenu_InvokeCommand() 696c2c66affSColin Finck */ 697c2c66affSColin Finck HRESULT WINAPI CCPLItemMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) 698c2c66affSColin Finck { 699c2c66affSColin Finck HRESULT hResult; 700c2c66affSColin Finck 701c2c66affSColin Finck PIDLCPanelStruct *pCPanel = _ILGetCPanelPointer(m_apidl[0]); 702c2c66affSColin Finck if(!pCPanel) 703c2c66affSColin Finck return E_FAIL; 704c2c66affSColin Finck 705c2c66affSColin Finck TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n", this, lpcmi, lpcmi->lpVerb, lpcmi->hwnd); 706c2c66affSColin Finck 70783335d3aSScott Maday if (lpcmi->lpVerb == MAKEINTRESOURCEA(0)) 708c2c66affSColin Finck { 709c2c66affSColin Finck /* Hardcode the command here; Executing a cpl file would be fine but we also need to run things like console.dll */ 710c2c66affSColin Finck WCHAR wszParams[MAX_PATH]; 711c2c66affSColin Finck PCWSTR wszFile = L"rundll32.exe"; 712c2c66affSColin Finck PCWSTR wszFormat = L"shell32.dll,Control_RunDLL %s,%s"; 713c2c66affSColin Finck 714c2c66affSColin Finck wsprintfW(wszParams, wszFormat, pCPanel->szName, pCPanel->szName + pCPanel->offsDispName); 715c2c66affSColin Finck 716c2c66affSColin Finck /* Note: we pass the applet name to Control_RunDLL to distinguish between multiple applets in one .cpl file */ 717c2c66affSColin Finck ShellExecuteW(NULL, NULL, wszFile, wszParams, NULL, 0); 718c2c66affSColin Finck } 71983335d3aSScott Maday else if (lpcmi->lpVerb == MAKEINTRESOURCEA(1)) //FIXME 720c2c66affSColin Finck { 721c2c66affSColin Finck CComPtr<IDataObject> pDataObj; 722c2c66affSColin Finck LPITEMIDLIST pidl = _ILCreateControlPanel(); 723c2c66affSColin Finck 724c2c66affSColin Finck hResult = SHCreateDataObject(pidl, m_cidl, m_apidl, NULL, IID_PPV_ARG(IDataObject, &pDataObj)); 725c2c66affSColin Finck if (FAILED(hResult)) 726c2c66affSColin Finck return hResult; 727c2c66affSColin Finck 728c2c66affSColin Finck SHFree(pidl); 729c2c66affSColin Finck 730c2c66affSColin Finck //FIXME: Use SHCreateLinks 731c2c66affSColin Finck CComPtr<IShellFolder> psf; 732c2c66affSColin Finck CComPtr<IDropTarget> pDT; 733c2c66affSColin Finck 734c2c66affSColin Finck hResult = SHGetDesktopFolder(&psf); 735c2c66affSColin Finck if (FAILED(hResult)) 736c2c66affSColin Finck return hResult; 737c2c66affSColin Finck 738c2c66affSColin Finck hResult = psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pDT)); 739c2c66affSColin Finck if (FAILED(hResult)) 740c2c66affSColin Finck return hResult; 741c2c66affSColin Finck 742c2c66affSColin Finck SHSimulateDrop(pDT, pDataObj, MK_CONTROL|MK_SHIFT, NULL, NULL); 743c2c66affSColin Finck } 744c2c66affSColin Finck return S_OK; 745c2c66affSColin Finck } 746c2c66affSColin Finck 747c2c66affSColin Finck /************************************************************************** 748c2c66affSColin Finck * ICPanel_IContextMenu_GetCommandString() 749c2c66affSColin Finck * 750c2c66affSColin Finck */ 751c2c66affSColin Finck HRESULT WINAPI CCPLItemMenu::GetCommandString( 752c2c66affSColin Finck UINT_PTR idCommand, 753c2c66affSColin Finck UINT uFlags, 754c2c66affSColin Finck UINT* lpReserved, 755c2c66affSColin Finck LPSTR lpszName, 756c2c66affSColin Finck UINT uMaxNameLen) 757c2c66affSColin Finck { 758c2c66affSColin Finck TRACE("(%p)->(idcom=%lx flags=%x %p name=%p len=%x)\n", this, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen); 759c2c66affSColin Finck 760c2c66affSColin Finck FIXME("unknown command string\n"); 761c2c66affSColin Finck return E_FAIL; 762c2c66affSColin Finck } 763c2c66affSColin Finck 764c2c66affSColin Finck /************************************************************************** 765c2c66affSColin Finck * ICPanel_IContextMenu_HandleMenuMsg() 766c2c66affSColin Finck */ 767c2c66affSColin Finck HRESULT WINAPI CCPLItemMenu::HandleMenuMsg( 768c2c66affSColin Finck UINT uMsg, 769c2c66affSColin Finck WPARAM wParam, 770c2c66affSColin Finck LPARAM lParam) 771c2c66affSColin Finck { 772c2c66affSColin Finck TRACE("ICPanel_IContextMenu_HandleMenuMsg (%p)->(msg=%x wp=%lx lp=%lx)\n", this, uMsg, wParam, lParam); 773c2c66affSColin Finck 774c2c66affSColin Finck return E_NOTIMPL; 775c2c66affSColin Finck } 776