/************************************************************************** * ISF_NetworkPlaces_Constructor */ HRESULT WINAPI ISF_NetworkPlaces_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) { IGenericSFImpl *sf; TRACE ("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid (riid)); if (!ppv) return E_POINTER; if (pUnkOuter) return CLASS_E_NOAGGREGATION; sf = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof (IGenericSFImpl)); if (!sf) return E_OUTOFMEMORY; sf->ref = 0; sf->IShellFolder2_iface.lpVtbl = &vt_ShellFolder2; sf->IPersistFolder2_iface.lpVtbl = &vt_NP_PersistFolder2; sf->pidlRoot = _ILCreateNetHood(); /* my qualified pidl */ if (FAILED (IShellFolder2_QueryInterface (&sf->IShellFolder2_iface, riid, ppv))) { IShellFolder2_Release (&sf->IShellFolder2_iface); return E_NOINTERFACE; } TRACE ("--(%p)\n", sf); return S_OK; }
/************************************************************************** * ISF_MyComputer_Constructor */ HRESULT WINAPI ISF_MyComputer_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) { IMyComputerFolderImpl *sf; TRACE ("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid (riid)); if (!ppv) return E_POINTER; if (pUnkOuter) return CLASS_E_NOAGGREGATION; sf = LocalAlloc (LMEM_ZEROINIT, sizeof (IMyComputerFolderImpl)); if (!sf) return E_OUTOFMEMORY; sf->ref = 0; sf->IShellFolder2_iface.lpVtbl = &vt_ShellFolder2; sf->IPersistFolder2_iface.lpVtbl = &vt_PersistFolder2; sf->pidlRoot = _ILCreateMyComputer (); /* my qualified pidl */ if (FAILED (IShellFolder2_QueryInterface (&sf->IShellFolder2_iface, riid, ppv))) { IShellFolder2_Release (&sf->IShellFolder2_iface); return E_NOINTERFACE; } TRACE ("--(%p)\n", sf); return S_OK; }
/************************************************************************** * IControlPanel_Constructor */ HRESULT WINAPI IControlPanel_Constructor(IUnknown* pUnkOuter, REFIID riid, LPVOID * ppv) { ICPanelImpl *sf; TRACE("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid(riid)); if (!ppv) return E_POINTER; if (pUnkOuter && !IsEqualIID (riid, &IID_IUnknown)) return CLASS_E_NOAGGREGATION; sf = LocalAlloc(LMEM_ZEROINIT, sizeof(ICPanelImpl)); if (!sf) return E_OUTOFMEMORY; sf->ref = 0; sf->IShellFolder2_iface.lpVtbl = &vt_ShellFolder2; sf->IPersistFolder2_iface.lpVtbl = &vt_PersistFolder2; sf->IShellExecuteHookW_iface.lpVtbl = &vt_ShellExecuteHookW; sf->IShellExecuteHookA_iface.lpVtbl = &vt_ShellExecuteHookA; sf->pidlRoot = _ILCreateControlPanel(); /* my qualified pidl */ sf->pUnkOuter = pUnkOuter ? pUnkOuter : (IUnknown *)&sf->IShellFolder2_iface; if (FAILED(IShellFolder2_QueryInterface(&sf->IShellFolder2_iface, riid, ppv))) { IShellFolder2_Release(&sf->IShellFolder2_iface); return E_NOINTERFACE; } TRACE("--(%p)\n", sf); return S_OK; }
static void DoErase(RecycleBinMenu *This) { ISFHelper *helper; IShellFolder2_QueryInterface(This->folder,&IID_ISFHelper,(void**)&helper); if(helper) ISFHelper_DeleteItems(helper,This->cidl,(LPCITEMIDLIST*)This->apidl); }
/************************************************************************ * ICPanel_PersistFolder2_QueryInterface */ static HRESULT WINAPI ICPanel_PersistFolder2_QueryInterface(IPersistFolder2 * iface, REFIID iid, LPVOID * ppvObject) { ICPanelImpl *This = impl_from_IPersistFolder2(iface); TRACE("(%p)\n", This); return IShellFolder2_QueryInterface(&This->IShellFolder2_iface, iid, ppvObject); }
/************************************************************************ * INPFldr_PersistFolder2_QueryInterface */ static HRESULT WINAPI INPFldr_PersistFolder2_QueryInterface (IPersistFolder2 * iface, REFIID iid, LPVOID * ppvObj) { IGenericSFImpl *This = impl_from_IPersistFolder2(iface); TRACE ("(%p)\n", This); return IShellFolder2_QueryInterface (&This->IShellFolder2_iface, iid, ppvObj); }
/************************************************************************** * ISF_NetworkPlaces_fnGetUIObjectOf * * PARAMETERS * hwndOwner [in] Parent window for any output * cidl [in] array size * apidl [in] simple pidl array * riid [in] Requested Interface * prgfInOut [ ] reserved * ppvObject [out] Resulting Interface * */ static HRESULT WINAPI ISF_NetworkPlaces_fnGetUIObjectOf (IShellFolder2 * iface, HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) { IGenericSFImpl *This = impl_from_IShellFolder2(iface); LPITEMIDLIST pidl; IUnknown *pObj = NULL; HRESULT hr = E_INVALIDARG; TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", This, hwndOwner, cidl, apidl, shdebugstr_guid (riid), prgfInOut, ppvOut); if (!ppvOut) return hr; *ppvOut = NULL; if (IsEqualIID (riid, &IID_IContextMenu) && (cidl >= 1)) { return ItemMenu_Constructor((IShellFolder*)iface, This->pidlRoot, apidl, cidl, riid, ppvOut); } else if (IsEqualIID (riid, &IID_IDataObject) && (cidl >= 1)) { pObj = (LPUNKNOWN) IDataObject_Constructor (hwndOwner, This->pidlRoot, apidl, cidl); hr = S_OK; } else if (IsEqualIID (riid, &IID_IExtractIconA) && (cidl == 1)) { pidl = ILCombine (This->pidlRoot, apidl[0]); pObj = (LPUNKNOWN) IExtractIconA_Constructor (pidl); SHFree (pidl); hr = S_OK; } else if (IsEqualIID (riid, &IID_IExtractIconW) && (cidl == 1)) { pidl = ILCombine (This->pidlRoot, apidl[0]); pObj = (LPUNKNOWN) IExtractIconW_Constructor (pidl); SHFree (pidl); hr = S_OK; } else if (IsEqualIID (riid, &IID_IDropTarget) && (cidl >= 1)) { hr = IShellFolder2_QueryInterface (iface, &IID_IDropTarget, (LPVOID *) & pObj); } else hr = E_NOINTERFACE; if (SUCCEEDED(hr) && !pObj) hr = E_OUTOFMEMORY; *ppvOut = pObj; TRACE ("(%p)->hr=0x%08x\n", This, hr); return hr; }
static void DoRestore(RecycleBinMenu *This) { /*TODO add prompts*/ UINT i; for(i=0;i<This->cidl;i++) { WIN32_FIND_DATAW data; TRASH_UnpackItemID(&((This->apidl[i])->mkid),&data); if(PathFileExistsW(data.cFileName)) { PIDLIST_ABSOLUTE dest_pidl = ILCreateFromPathW(data.cFileName); WCHAR message[100]; WCHAR caption[50]; if(_ILIsFolder(ILFindLastID(dest_pidl))) LoadStringW(shell32_hInstance,IDS_RECYCLEBIN_OVERWRITEFOLDER, message,sizeof(message)/sizeof(WCHAR)); else LoadStringW(shell32_hInstance,IDS_RECYCLEBIN_OVERWRITEFILE, message,sizeof(message)/sizeof(WCHAR)); LoadStringW(shell32_hInstance,IDS_RECYCLEBIN_OVERWRITE_CAPTION, caption,sizeof(caption)/sizeof(WCHAR)); if(ShellMessageBoxW(shell32_hInstance,GetActiveWindow(),message, caption,MB_YESNO|MB_ICONEXCLAMATION, data.cFileName)!=IDYES) continue; } if(SUCCEEDED(TRASH_RestoreItem(This->apidl[i]))) { IPersistFolder2 *persist; LPITEMIDLIST root_pidl; PIDLIST_ABSOLUTE dest_pidl = ILCreateFromPathW(data.cFileName); BOOL is_folder = _ILIsFolder(ILFindLastID(dest_pidl)); IShellFolder2_QueryInterface(This->folder,&IID_IPersistFolder2, (void**)&persist); IPersistFolder2_GetCurFolder(persist,&root_pidl); SHChangeNotify(is_folder ? SHCNE_RMDIR : SHCNE_DELETE, SHCNF_IDLIST,ILCombine(root_pidl,This->apidl[i]),0); SHChangeNotify(is_folder ? SHCNE_MKDIR : SHCNE_CREATE, SHCNF_IDLIST,dest_pidl,0); ILFree(dest_pidl); ILFree(root_pidl); } } }
/************************************************************************** * ISF_Desktop_Constructor */ HRESULT WINAPI ISF_Desktop_Constructor ( IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) { static IDesktopFolderImpl *cached_sf; WCHAR szMyPath[MAX_PATH]; TRACE ("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid (riid)); if (!ppv) return E_POINTER; if (pUnkOuter) return CLASS_E_NOAGGREGATION; if (!cached_sf) { IDesktopFolderImpl *sf; if (!SHGetSpecialFolderPathW( 0, szMyPath, CSIDL_DESKTOPDIRECTORY, TRUE )) return E_UNEXPECTED; sf = LocalAlloc( LMEM_ZEROINIT, sizeof (IDesktopFolderImpl) ); if (!sf) return E_OUTOFMEMORY; sf->ref = 1; sf->IShellFolder2_iface.lpVtbl = &vt_MCFldr_ShellFolder2; sf->IPersistFolder2_iface.lpVtbl = &vt_IPersistFolder2; sf->pidlRoot = _ILCreateDesktop(); /* my qualified pidl */ sf->sPathTarget = SHAlloc( (lstrlenW(szMyPath) + 1)*sizeof(WCHAR) ); lstrcpyW( sf->sPathTarget, szMyPath ); if (InterlockedCompareExchangePointer((void *)&cached_sf, sf, NULL) != NULL) { /* some other thread already been here */ SHFree( sf->pidlRoot ); SHFree( sf->sPathTarget ); LocalFree( sf ); } } return IShellFolder2_QueryInterface( &cached_sf->IShellFolder2_iface, riid, ppv ); }
/************************************************************************** * IPersist */ static HRESULT WINAPI ISF_Desktop_IPersistFolder2_fnQueryInterface( IPersistFolder2 *iface, REFIID riid, LPVOID *ppvObj) { IDesktopFolderImpl *This = impl_from_IPersistFolder2( iface ); return IShellFolder2_QueryInterface(&This->IShellFolder2_iface, riid, ppvObj); }
static void test_printers_folder(void) { IShellFolder2 *folder; IPersistFolder2 *pf; SHELLDETAILS details; SHCOLSTATEF state; LPITEMIDLIST pidl1, pidl2; HRESULT hr; INT i; CoInitialize( NULL ); hr = CoCreateInstance(&CLSID_Printers, NULL, CLSCTX_INPROC_SERVER, &IID_IShellFolder2, (void**)&folder); if (hr != S_OK) { win_skip("Failed to created IShellFolder2 for Printers folder\n"); CoUninitialize(); return; } if (0) { /* crashes on XP */ hr = IShellFolder2_GetDetailsOf(folder, NULL, 0, NULL); hr = IShellFolder2_GetDefaultColumnState(folder, 0, NULL); hr = IPersistFolder2_GetCurFolder(pf, NULL); } /* 5 columns defined */ hr = IShellFolder2_GetDetailsOf(folder, NULL, 6, &details); ok(hr == E_NOTIMPL, "got 0x%08x\n", hr); hr = IShellFolder2_GetDefaultColumnState(folder, 6, &state); ok(broken(hr == E_NOTIMPL) || hr == E_INVALIDARG /* Win7 */, "got 0x%08x\n", hr); hr = IShellFolder2_GetDetailsOf(folder, NULL, 0, &details); ok(hr == S_OK || broken(E_NOTIMPL) /* W2K */, "got 0x%08x\n", hr); /* test every column if method is implemented */ if (hr == S_OK) { ok(details.str.uType == STRRET_WSTR, "got %d\n", details.str.uType); for(i = 0; i < 6; i++) { hr = IShellFolder2_GetDetailsOf(folder, NULL, i, &details); ok(hr == S_OK, "got 0x%08x\n", hr); /* all columns are left-aligned */ ok(details.fmt == LVCFMT_LEFT, "got 0x%x\n", details.fmt); /* can't be on w9x at this point, IShellFolder2 unsupported there, check present for running Wine with w9x setup */ if (SHELL_OsIsUnicode()) SHFree(details.str.u.pOleStr); hr = IShellFolder2_GetDefaultColumnState(folder, i, &state); ok(hr == S_OK, "got 0x%08x\n", hr); /* all columns are string except document count */ if (i == 1) ok(state == (SHCOLSTATE_TYPE_INT | SHCOLSTATE_ONBYDEFAULT), "got 0x%x\n", state); else ok(state == (SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT), "got 0x%x\n", state); } } /* default pidl */ hr = IShellFolder2_QueryInterface(folder, &IID_IPersistFolder2, (void**)&pf); ok(hr == S_OK, "got 0x%08x\n", hr); /* not initialized */ pidl1 = (void*)0xdeadbeef; hr = IPersistFolder2_GetCurFolder(pf, &pidl1); ok(hr == S_FALSE, "got 0x%08x\n", hr); ok(pidl1 == NULL, "got %p\n", pidl1); hr = SHGetSpecialFolderLocation(NULL, CSIDL_PRINTERS, &pidl2); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IPersistFolder2_Initialize(pf, pidl2); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IPersistFolder2_GetCurFolder(pf, &pidl1); ok(hr == S_OK, "got 0x%08x\n", hr); ok(ILIsEqual(pidl1, pidl2), "expected same PIDL\n"); IPersistFolder2_Release(pf); ILFree(pidl1); ILFree(pidl2); IShellFolder2_Release(folder); CoUninitialize(); }