CFileContextMenuManager::CFileContextMenuManager(HWND hwnd, LPITEMIDLIST pidlParent,std::list<LPITEMIDLIST> pidlItemList) : m_hwnd(hwnd), m_pidlParent(ILClone(pidlParent)), m_pShellContext3(NULL), m_pShellContext2(NULL), m_pShellContext(NULL) { IContextMenu *pContextMenu = NULL; HRESULT hr; for each(auto pidl in pidlItemList) { m_pidlItemList.push_back(ILClone(pidl)); }
HRESULT WINAPI CRecycleBinItemContextMenu::Initialize(LPCITEMIDLIST pidl) { apidl = ILClone(pidl); if (apidl == NULL) return E_OUTOFMEMORY; return S_OK; }
HRESULT CDS_IDLDropTarget_Create(HWND hwndOwner, IDropTargetVtbl *lpVtbl, LPCITEMIDLIST pidl, LPDROPTARGET *ppdropt) { LPIDLDROPTARGET pidldt = (void*)LocalAlloc(LPTR, SIZEOF(CIDLDropTarget)); if (pidldt) { pidldt->pidl = ILClone(pidl); if (pidldt->pidl) { pidldt->dropt.lpVtbl = lpVtbl; pidldt->cRef = 1; pidldt->hwndOwner = hwndOwner; Assert(pidldt->pdtgAgr == NULL); *ppdropt = &pidldt->dropt; return S_OK; } else LocalFree((HLOCAL)pidldt); } *ppdropt = NULL; return E_OUTOFMEMORY; }
HRESULT WINAPI SHCreateDefaultContextMenu(const DEFCONTEXTMENU *pdcm, REFIID riid, void **ppv) { IShellFolder *folder=pdcm->psf; LPITEMIDLIST folder_pidl; HRESULT ret; IContextMenu *system_menu; TRACE("(%p,%s,%p)\n",pdcm,shdebugstr_guid(riid),ppv); if(!pdcm->pidlFolder) { IPersistFolder2 *persist; IShellFolder_QueryInterface(folder,&IID_IPersistFolder2,(void**)&persist); IPersistFolder2_GetCurFolder(persist,&folder_pidl); IPersistFolder2_Release(persist); } else folder_pidl=ILClone(pdcm->pidlFolder); if(pdcm->cKeys==0) FIXME("Loading shell extensions using IQueryAssociations not yet supported\n"); ItemMenu_Constructor(folder, folder_pidl, (const LPCITEMIDLIST*)pdcm->apidl, pdcm->cidl, &IID_IContextMenu, (void**)&system_menu); ret = SHELL_CreateContextMenu(pdcm->hwnd,system_menu,folder,folder_pidl,(LPCITEMIDLIST*)pdcm->apidl,pdcm->cidl,pdcm->aKeys,pdcm->cKeys,riid,ppv); IContextMenu_Release(system_menu); ILFree(folder_pidl); return ret; }
/************************************************************************** * IDataObject_Constructor */ LPDATAOBJECT IDataObject_Constructor(HWND hwndOwner, LPITEMIDLIST pMyPidl, LPITEMIDLIST * apidl, UINT cidl) { IDataObjectImpl* dto; dto = (IDataObjectImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDataObjectImpl)); if (dto) { dto->ref = 1; ICOM_VTBL(dto) = &dtovt; dto->pidl = ILClone(pMyPidl); dto->apidl = _ILCopyaPidl(apidl, cidl); dto->cidl = cidl; dto->cfShellIDList = RegisterClipboardFormatA(CFSTR_SHELLIDLIST); dto->cfFileName = RegisterClipboardFormatA(CFSTR_FILENAMEA); InitFormatEtc(dto->pFormatEtc[0], dto->cfShellIDList, TYMED_HGLOBAL); InitFormatEtc(dto->pFormatEtc[1], CF_HDROP, TYMED_HGLOBAL); InitFormatEtc(dto->pFormatEtc[2], dto->cfFileName, TYMED_HGLOBAL); shell32_ObjCount++; } TRACE("(%p)->(apidl=%p cidl=%u)\n",dto, apidl, cidl); return (LPDATAOBJECT)dto; }
HRESULT ItemMenu_Constructor(IShellFolder *parent, LPCITEMIDLIST pidl, const LPCITEMIDLIST *apidl, UINT cidl, REFIID riid, void **pObj) { ContextMenu* This; HRESULT hr; UINT i; This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This)); if (!This) return E_OUTOFMEMORY; This->IContextMenu3_iface.lpVtbl = &ItemContextMenuVtbl; This->ref = 1; This->parent = parent; if (parent) IShellFolder_AddRef(parent); This->pidl = ILClone(pidl); This->apidl = _ILCopyaPidl(apidl, cidl); This->cidl = cidl; This->allvalues = TRUE; This->desktop = FALSE; for (i = 0; i < cidl; i++) This->allvalues &= (_ILIsValue(apidl[i]) ? 1 : 0); hr = IContextMenu3_QueryInterface(&This->IContextMenu3_iface, riid, pObj); IContextMenu3_Release(&This->IContextMenu3_iface); return hr; }
/************************************************************************** * CPrinterFolder::GetCurFolder */ HRESULT WINAPI CPrinterFolder::GetCurFolder(LPITEMIDLIST * pidl) { TRACE ("(%p)->(%p)\n", this, pidl); *pidl = ILClone (pidlRoot); return S_OK; }
/************************************************************************** * ISvItemCm_Constructor() */ IContextMenu2 *ISvItemCm_Constructor(LPSHELLFOLDER pSFParent, LPCITEMIDLIST pidl, const LPCITEMIDLIST *apidl, UINT cidl) { ItemCmImpl* cm; UINT u; cm = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(ItemCmImpl)); cm->IContextMenu2_iface.lpVtbl = &cmvt; cm->ref = 1; cm->pidl = ILClone(pidl); cm->pSFParent = pSFParent; if(pSFParent) IShellFolder_AddRef(pSFParent); cm->apidl = _ILCopyaPidl(apidl, cidl); cm->cidl = cidl; cm->bAllValues = 1; for(u = 0; u < cidl; u++) { cm->bAllValues &= (_ILIsValue(apidl[u]) ? 1 : 0); } TRACE("(%p)->()\n",cm); return &cm->IContextMenu2_iface; }
static LPITEMIDLIST _ILReadFromSharedMemory(PCWSTR strField) { LPITEMIDLIST ret = NULL; // Ensure it really is an IDLIST-formatted parameter // Format for IDLIST params: ":pid:shared" if (*strField != L':') return NULL; HANDLE hData = (HANDLE) StrToIntW(strField + 1); PWSTR strSecond = StrChrW(strField + 1, L':'); if (strSecond) { int pid = StrToIntW(strSecond + 1); void* pvShared = SHLockShared(hData, pid); if (pvShared) { ret = ILClone((LPCITEMIDLIST) pvShared); SHUnlockShared(pvShared); SHFreeShared(hData, pid); } } return ret; }
HRESULT WINAPI CDefFolderMenu_Create2(LPCITEMIDLIST pidlFolder, HWND hwnd, UINT cidl, LPCITEMIDLIST *apidl, IShellFolder *psf, LPFNDFMCALLBACK lpfn, UINT nKeys, const HKEY *ahkeys, IContextMenu **ppcm) { IContextMenu *system_menu; HRESULT hres; LPITEMIDLIST folder_pidl; TRACE("(%p,%p,%u,%p,%p,%u,%p,%p)\n",pidlFolder,hwnd,cidl,apidl,psf,nKeys,ahkeys,ppcm); if(!pidlFolder) { IPersistFolder2 *persist; IShellFolder_QueryInterface(psf,&IID_IPersistFolder2,(void**)&persist); IPersistFolder2_GetCurFolder(persist,&folder_pidl); IPersistFolder2_Release(persist); } else folder_pidl=ILClone(pidlFolder); ItemMenu_Constructor(psf, folder_pidl, (const LPCITEMIDLIST*)apidl, cidl, &IID_IContextMenu, (void**)&system_menu); hres= SHELL_CreateContextMenu(hwnd,system_menu,psf,folder_pidl,apidl,cidl,ahkeys,nKeys,&IID_IContextMenu,(void**)ppcm); IContextMenu_Release(system_menu); ILFree(folder_pidl); return hres; }
static HRESULT WINAPI RecycleBin_GetCurFolder(IPersistFolder2 *iface, LPITEMIDLIST *ppidl) { RecycleBin *This = impl_from_IPersistFolder2(iface); TRACE("\n"); *ppidl = ILClone(This->pidl); return S_OK; }
/************************************************************************ * ISF_NetConnect_PersistFolder2_Initialize * * NOTES: it makes no sense to change the pidl */ HRESULT WINAPI CNetworkConnections::Initialize(PCIDLIST_ABSOLUTE pidl) { SHFree(m_pidlRoot); m_pidlRoot = ILClone(pidl); return S_OK; }
static BOOL BrsFolder_OnCommand( browse_info *info, UINT id ) { LPBROWSEINFOW lpBrowseInfo = info->lpBrowseInfo; switch (id) { case IDOK: /* The original pidl is owned by the treeview and will be free'd. */ info->pidlRet = ILClone(info->pidlRet); if (info->pidlRet == NULL) /* A null pidl would mean a cancel */ info->pidlRet = _ILCreateDesktop(); pdump( info->pidlRet ); if (lpBrowseInfo->pszDisplayName) SHGetPathFromIDListW( info->pidlRet, lpBrowseInfo->pszDisplayName ); EndDialog( info->hWnd, 1 ); return TRUE; case IDCANCEL: EndDialog( info->hWnd, 0 ); return TRUE; case IDD_MAKENEWFOLDER: FIXME("make new folder not implemented\n"); return TRUE; } return FALSE; }
static HRESULT WINAPI ISF_Desktop_IPersistFolder2_fnGetCurFolder( IPersistFolder2 *iface, LPITEMIDLIST *ppidl) { IDesktopFolderImpl *This = impl_from_IPersistFolder2( iface ); *ppidl = ILClone(This->pidlRoot); return S_OK; }
/************************************************************************ * ISF_NetConnect_PersistFolder2_Initialize * * NOTES: it makes no sense to change the pidl */ HRESULT WINAPI CNetworkConnections::Initialize(LPCITEMIDLIST pidl) { SHFree(pidlRoot); pidlRoot = ILClone(pidl); return S_OK; }
HRESULT CMenuSFToolbar::GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv) { HRESULT hr; hr = m_shellFolder->QueryInterface(riid, ppv); if (FAILED_UNEXPECTEDLY(hr)) return hr; if (pdwFlags) *pdwFlags = m_dwMenuFlags; if (ppidl) { LPITEMIDLIST pidl = NULL; if (m_idList) { pidl = ILClone(m_idList); if (!pidl) { ERR("ILClone failed!\n"); (*reinterpret_cast<IUnknown**>(ppv))->Release(); return E_FAIL; } } *ppidl = pidl; } return hr; }
static BOOL BrsFolder_OnCommand( browse_info *info, UINT id ) { LPBROWSEINFOW lpBrowseInfo = info->lpBrowseInfo; switch (id) { case IDOK: #ifdef __REACTOS__ /* The original pidl is owned by the treeview and will be free'd. */ info->pidlRet = ILClone(info->pidlRet); #endif if (info->pidlRet == NULL) /* A null pidl would mean a cancel */ info->pidlRet = _ILCreateDesktop(); pdump( info->pidlRet ); if (lpBrowseInfo->pszDisplayName) SHGetPathFromIDListW( info->pidlRet, lpBrowseInfo->pszDisplayName ); EndDialog( info->hWnd, 1 ); return TRUE; case IDCANCEL: EndDialog( info->hWnd, 0 ); return TRUE; case IDC_BROWSE_FOR_FOLDER_NEW_FOLDER: BrsFolder_NewFolder(info); return TRUE; } return FALSE; }
HRESULT WINAPI CPrintersExtractIconW::Initialize(LPCITEMIDLIST pidl) { pidl = ILClone(pidl); pdump(pidl); return S_OK; }
HRESULT SHELL32_SetNameOfGuidItem(PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) { GUID const *clsid = _ILGetGUIDPointer (pidl); LPOLESTR pStr; HRESULT hr; WCHAR szName[100]; if (!clsid) { ERR("Pidl is not reg item!\n"); return E_FAIL; } hr = StringFromCLSID(*clsid, &pStr); if (FAILED_UNEXPECTEDLY(hr)) return hr; swprintf(szName, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\%s", pStr); DWORD cbData = (wcslen(lpName) + 1) * sizeof(WCHAR); LONG res = SHSetValueW(HKEY_CURRENT_USER, szName, NULL, RRF_RT_REG_SZ, lpName, cbData); CoTaskMemFree(pStr); if (res == ERROR_SUCCESS) { *pPidlOut = ILClone(pidl); return S_OK; } return E_FAIL; }
static HRESULT WINAPI IExplorerBrowserEventsImpl_fnOnNavigationComplete(IExplorerBrowserEvents *iface, PCIDLIST_ABSOLUTE pidl) { IExplorerBrowserEventsImpl *This = impl_from_IExplorerBrowserEvents(iface); ILFree(This->info->pidl); This->info->pidl = ILClone(pidl); update_path_box(This->info); return S_OK; }
HRESULT WINAPI CDesktopFolder::GetCurFolder(LPITEMIDLIST * pidl) { TRACE ("(%p)->(%p)\n", this, pidl); if (!pidl) return E_POINTER; *pidl = ILClone (pidlRoot); return S_OK; }
/************************************************************************ * CNetFolder::Initialize * * NOTES: it makes no sense to change the pidl */ HRESULT WINAPI CNetFolder::Initialize(LPCITEMIDLIST pidl) { if (pidlRoot) SHFree((LPVOID)pidlRoot); pidlRoot = ILClone(pidl); return S_OK; }
/************************************************************************** * ISF_NetConnect_PersistFolder2_GetCurFolder */ HRESULT WINAPI CNetworkConnections::GetCurFolder(LPITEMIDLIST *pidl) { if (!pidl) return E_POINTER; *pidl = ILClone(pidlRoot); return S_OK; }
/************************************************************************** * ISF_NetConnect_PersistFolder2_GetCurFolder */ HRESULT WINAPI CNetworkConnections::GetCurFolder(PIDLIST_ABSOLUTE *pidl) { if (!pidl) return E_POINTER; *pidl = ILClone(m_pidlRoot); return S_OK; }
HRESULT WINAPI SHCreateShellItem(LPCITEMIDLIST pidlParent, IShellFolder *psfParent, LPCITEMIDLIST pidl, IShellItem **ppsi) { LPITEMIDLIST new_pidl; HRESULT ret; TRACE("(%p,%p,%p,%p)\n", pidlParent, psfParent, pidl, ppsi); *ppsi = NULL; if (!pidl) { return E_INVALIDARG; } else if (pidlParent || psfParent) { LPITEMIDLIST temp_parent=NULL; if (!pidlParent) { IPersistFolder2* ppf2Parent; if (FAILED(IShellFolder_QueryInterface(psfParent, &IID_IPersistFolder2, (void**)&ppf2Parent))) { FIXME("couldn't get IPersistFolder2 interface of parent\n"); return E_NOINTERFACE; } if (FAILED(IPersistFolder2_GetCurFolder(ppf2Parent, &temp_parent))) { FIXME("couldn't get parent PIDL\n"); IPersistFolder2_Release(ppf2Parent); return E_NOINTERFACE; } pidlParent = temp_parent; IPersistFolder2_Release(ppf2Parent); } new_pidl = ILCombine(pidlParent, pidl); ILFree(temp_parent); if (!new_pidl) return E_OUTOFMEMORY; } else { new_pidl = ILClone(pidl); if (!new_pidl) return E_OUTOFMEMORY; } ret = SHCreateItemFromIDList(new_pidl, &IID_IShellItem, (void**)ppsi); ILFree(new_pidl); return ret; }
static HRESULT WINAPI RecycleBin_Initialize(IPersistFolder2 *iface, LPCITEMIDLIST pidl) { RecycleBin *This = impl_from_IPersistFolder2(iface); TRACE("(%p, %p)\n", This, pidl); This->pidl = ILClone(pidl); if (This->pidl == NULL) return E_OUTOFMEMORY; return S_OK; }
HRESULT WINAPI CRecycleBin::Initialize(LPCITEMIDLIST pidl) { TRACE("(%p, %p)\n", this, pidl); SHFree((LPVOID)this->pidl); this->pidl = ILClone(pidl); if (this->pidl == NULL) return E_OUTOFMEMORY; return S_OK; }
/************************************************************************** * IPF_Printers_fnGetCurFolder */ static HRESULT WINAPI IPF_Printers_GetCurFolder ( IPersistFolder2 * iface, LPITEMIDLIST * pidl) { _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl, iface); TRACE ("(%p)->(%p)\n", This, pidl); *pidl = ILClone (This->pidlRoot); return S_OK; }
/************************************************************************ * IPF_Printers_Initialize * */ static HRESULT WINAPI IPF_Printers_Initialize ( IPersistFolder2 * iface, LPCITEMIDLIST pidl) { _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl, iface); if (This->pidlRoot) SHFree((LPVOID)This->pidlRoot); This->pidlRoot = ILClone(pidl); return S_OK; }
// *** Folder2 methods *** HRESULT STDMETHODCALLTYPE CFolder::get_Self(FolderItem **ppfi) { TRACE("(%p, %p)\n", this, ppfi); if (!ppfi) return E_POINTER; CFolderItem* item = new CComObject<CFolderItem>(); item->AddRef(); item->Init(ILClone(m_idlist)); *ppfi = item; return S_OK; }