static TRASH_BUCKET *TRASH_CreateHomeBucket(void) { TRASH_BUCKET *bucket; struct stat trash_stat; char *trash_path = NULL; bucket = SHAlloc(sizeof(TRASH_BUCKET)); if (bucket == NULL) { errno = ENOMEM; goto error; } memset(bucket, 0, sizeof(*bucket)); bucket->info_dir = init_home_dir("Trash/info/"); if (bucket->info_dir == NULL) goto error; bucket->files_dir = init_home_dir("Trash/files/"); if (bucket->files_dir == NULL) goto error; trash_path = XDG_BuildPath(XDG_DATA_HOME, "Trash/"); if (stat(trash_path, &trash_stat) == -1) goto error; bucket->device = trash_stat.st_dev; SHFree(trash_path); return bucket; error: SHFree(trash_path); if (bucket) { SHFree(bucket->info_dir); SHFree(bucket->files_dir); } SHFree(bucket); return NULL; }
/************************************************************************** * ISF_Fonts_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_Fonts_fnGetUIObjectOf (IShellFolder2 * iface, HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) { IGenericSFImpl *This = (IGenericSFImpl *)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)) { pObj = (IUnknown*)(&This->lpVtblContextMenuFontItem); This->apidl = apidl[0]; IUnknown_AddRef(pObj); hr = S_OK; } 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 = IShellFolder_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; }
/************************************************************************** * CAdminToolsFolder::GetUIObjectOf * * PARAMETERS * HWND hwndOwner, //[in ] Parent window for any output * UINT cidl, //[in ] array size * LPCITEMIDLIST* apidl, //[in ] simple pidl array * REFIID riid, //[in ] Requested Interface * UINT* prgfInOut, //[ ] reserved * LPVOID* ppvObject) //[out] Resulting Interface * */ HRESULT WINAPI CAdminToolsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) { LPITEMIDLIST pidl; CComPtr<IUnknown> pObj; 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)) { hr = CDefFolderMenu_Create2(pidlRoot, hwndOwner, cidl, apidl, (IShellFolder *)this, NULL, 0, NULL, (IContextMenu **)&pObj); } else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1)) { hr = IDataObject_Constructor(hwndOwner, pidlRoot, apidl, cidl, (IDataObject **)&pObj); } else if (IsEqualIID (riid, IID_IExtractIconA) && (cidl == 1)) { pidl = ILCombine (pidlRoot, apidl[0]); pObj = (LPUNKNOWN) IExtractIconA_Constructor (pidl); SHFree (pidl); hr = S_OK; } else if (IsEqualIID (riid, IID_IExtractIconW) && (cidl == 1)) { pidl = ILCombine (pidlRoot, apidl[0]); pObj = (LPUNKNOWN) IExtractIconW_Constructor (pidl); SHFree (pidl); hr = S_OK; } else if (IsEqualIID (riid, IID_IDropTarget) && (cidl >= 1)) { hr = this->QueryInterface(IID_IDropTarget, (LPVOID *)&pObj); } else if ((IsEqualIID(riid, IID_IShellLinkW) || IsEqualIID(riid, IID_IShellLinkA)) && (cidl == 1)) { pidl = ILCombine (pidlRoot, apidl[0]); hr = IShellLink_ConstructFromFile(NULL, riid, pidl, (LPVOID*)&pObj); SHFree (pidl); } else hr = E_NOINTERFACE; if (SUCCEEDED(hr) && !pObj) hr = E_OUTOFMEMORY; *ppvOut = pObj.Detach(); TRACE ("(%p)->hr=0x%08x\n", this, hr); return hr; }
/****************************************************************************** * FillTreeView [Internal] * * For each child (given by lpe) of the parent shell folder, which is given by * lpsf and whose PIDL is pidl, insert a treeview-item right under hParent * * PARAMS * info [I] data for the dialog * lpsf [I] IShellFolder interface of the parent shell folder * pidl [I] ITEMIDLIST of the parent shell folder * hParent [I] The treeview item that represents the parent shell folder * lpe [I] An iterator for the children of the parent shell folder */ static void FillTreeView( browse_info *info, IShellFolder * lpsf, LPITEMIDLIST pidl, HTREEITEM hParent, IEnumIDList* lpe) { HTREEITEM hPrev = 0; LPITEMIDLIST pidlTemp = 0; ULONG ulFetched; HRESULT hr; HWND hwnd = GetParent( info->hwndTreeView ); TRACE("%p %p %p %p\n",lpsf, pidl, hParent, lpe); /* No IEnumIDList -> No children */ if (!lpe) return; SetCapture( hwnd ); SetCursor( LoadCursorA( 0, (LPSTR)IDC_WAIT ) ); while (NOERROR == IEnumIDList_Next(lpe,1,&pidlTemp,&ulFetched)) { ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER; IEnumIDList* pEnumIL = NULL; IShellFolder* pSFChild = NULL; IShellFolder_GetAttributesOf(lpsf, 1, (LPCITEMIDLIST*)&pidlTemp, &ulAttrs); if (ulAttrs & SFGAO_FOLDER) { hr = IShellFolder_BindToObject(lpsf,pidlTemp,NULL,&IID_IShellFolder,(LPVOID*)&pSFChild); if (SUCCEEDED(hr)) { DWORD flags = BrowseFlagsToSHCONTF(info->lpBrowseInfo->ulFlags); hr = IShellFolder_EnumObjects(pSFChild, hwnd, flags, &pEnumIL); if (hr == S_OK) { if ((IEnumIDList_Skip(pEnumIL, 1) != S_OK) || FAILED(IEnumIDList_Reset(pEnumIL))) { IEnumIDList_Release(pEnumIL); pEnumIL = NULL; } } IShellFolder_Release(pSFChild); } } if (!(hPrev = InsertTreeViewItem(info, lpsf, pidlTemp, pidl, pEnumIL, hParent))) goto done; SHFree(pidlTemp); /* Finally, free the pidl that the shell gave us... */ pidlTemp=NULL; } done: ReleaseCapture(); SetCursor(LoadCursorW(0, (LPWSTR)IDC_ARROW)); SHFree(pidlTemp); }
CEnumIDList::~CEnumIDList() { LPENUMLIST pDelete; while (m_pFirst) { pDelete = m_pFirst; m_pFirst = pDelete->pNext; SHFree(pDelete->pidl); SHFree(pDelete); } }
/************************************************************************** * CControlPanelFolder::GetUIObjectOf * * PARAMETERS * HWND hwndOwner, //[in ] Parent window for any output * UINT cidl, //[in ] array size * LPCITEMIDLIST* apidl, //[in ] simple pidl array * REFIID riid, //[in ] Requested Interface * UINT* prgfInOut, //[ ] reserved * LPVOID* ppvObject) //[out] Resulting Interface * */ HRESULT WINAPI CControlPanelFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) { 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) { *ppvOut = NULL; if (IsEqualIID(riid, IID_IContextMenu) && (cidl >= 1)) { // TODO // create a seperate item struct // pObj = (IContextMenu *)this; this->apidl = apidl; this->cidl = cidl; pObj->AddRef(); hr = S_OK; } else if (IsEqualIID(riid, IID_IDataObject) && (cidl >= 1)) { hr = IDataObject_Constructor(hwndOwner, pidlRoot, apidl, cidl, (IDataObject **)&pObj); } else if (IsEqualIID(riid, IID_IExtractIconA) && (cidl == 1)) { pidl = ILCombine(pidlRoot, apidl[0]); pObj = IExtractIconA_Constructor(pidl); SHFree(pidl); hr = S_OK; } else if (IsEqualIID(riid, IID_IExtractIconW) && (cidl == 1)) { pidl = ILCombine(pidlRoot, apidl[0]); pObj = IExtractIconW_Constructor(pidl); SHFree(pidl); hr = S_OK; } else if ((IsEqualIID(riid, IID_IShellLinkW) || IsEqualIID(riid, IID_IShellLinkA)) && (cidl == 1)) { pidl = ILCombine(pidlRoot, apidl[0]); hr = IShellLink_ConstructFromFile(NULL, riid, pidl, (LPVOID*)&pObj); SHFree(pidl); } else { hr = E_NOINTERFACE; } if (SUCCEEDED(hr) && !pObj) hr = E_OUTOFMEMORY; *ppvOut = pObj; } TRACE("(%p)->hr=0x%08x\n", this, hr); return hr; }
/************************************************************************** * ISF_ControlPanel_fnGetUIObjectOf * * PARAMETERS * HWND hwndOwner, //[in ] Parent window for any output * UINT cidl, //[in ] array size * LPCITEMIDLIST* apidl, //[in ] simple pidl array * REFIID riid, //[in ] Requested Interface * UINT* prgfInOut, //[ ] reserved * LPVOID* ppvObject) //[out] Resulting Interface * */ static HRESULT WINAPI ISF_ControlPanel_fnGetUIObjectOf(IShellFolder2 * iface, HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) { ICPanelImpl *This = (ICPanelImpl *)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) { *ppvOut = NULL; if (IsEqualIID(riid, &IID_IContextMenu) &&(cidl >= 1)) { pObj = (LPUNKNOWN) ISvItemCm_Constructor((IShellFolder *) iface, This->pidlRoot, apidl, cidl); hr = S_OK; } 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_IShellLinkW) || IsEqualIID(riid,&IID_IShellLinkA)) && (cidl == 1)) { pidl = ILCombine(This->pidlRoot, apidl[0]); hr = IShellLink_ConstructFromFile(NULL, riid, pidl,(LPVOID*)&pObj); SHFree(pidl); } else { hr = E_NOINTERFACE; } if (SUCCEEDED(hr) && !pObj) hr = E_OUTOFMEMORY; *ppvOut = pObj; } TRACE("(%p)->hr=0x%08lx\n", This, hr); return hr; }
BOOL WINAPI CRecycleBinEnum::CBEnumRecycleBin(IN HANDLE hDeletedFile) { PDELETED_FILE_DETAILS_W pFileDetails; DWORD dwSize; LPITEMIDLIST pidl = NULL; BOOL ret; if (!GetDeletedFileDetailsW(hDeletedFile, 0, NULL, &dwSize) && GetLastError() != ERROR_INSUFFICIENT_BUFFER) { ERR("GetDeletedFileDetailsW failed\n"); return FALSE; } pFileDetails = (DELETED_FILE_DETAILS_W *)SHAlloc(dwSize); if (!pFileDetails) { ERR("No memory\n"); return FALSE; } if (!GetDeletedFileDetailsW(hDeletedFile, dwSize, pFileDetails, NULL)) { ERR("GetDeletedFileDetailsW failed\n"); SHFree(pFileDetails); return FALSE; } pidl = _ILCreateRecycleItem(pFileDetails); if (!pidl) { SHFree(pFileDetails); return FALSE; } ret = AddToEnumList(pidl); if (!ret) SHFree(pidl); SHFree(pFileDetails); TRACE("Returning %d\n", ret); CloseRecycleBinHandle(hDeletedFile); return ret; }
static LRESULT BrsFolder_Treeview_Delete( browse_info *info, NMTREEVIEWW *pnmtv ) { LPTV_ITEMDATA lptvid = (LPTV_ITEMDATA)pnmtv->itemOld.lParam; TRACE("TVN_DELETEITEMA/W %p\n", lptvid); IShellFolder_Release(lptvid->lpsfParent); if (lptvid->pEnumIL) IEnumIDList_Release(lptvid->pEnumIL); SHFree(lptvid->lpi); SHFree(lptvid->lpifq); SHFree(lptvid); return 0; }
static BOOL DeleteList(IEnumIDListImpl *This) { struct enumlist *pDelete; TRACE("(%p)->()\n",This); while(This->mpFirst) { pDelete = This->mpFirst; This->mpFirst = pDelete->pNext; SHFree(pDelete->pidl); SHFree(pDelete); } This->mpFirst = This->mpLast = This->mpCurrent = NULL; return TRUE; }
HRESULT TRASH_RestoreItem(LPCITEMIDLIST pidl){ int suffix_length = strlen(trashinfo_suffix); LPCSHITEMID id = &(pidl->mkid); const char *bucket_name = (const char*)(id->abID+1+sizeof(WIN32_FIND_DATAW)); const char *filename = (const char*)(id->abID+1+sizeof(WIN32_FIND_DATAW)+strlen(bucket_name)+1); char *restore_path; WIN32_FIND_DATAW data; char *file_path; TRACE("(%p)\n",pidl); if(strcmp(filename+strlen(filename)-suffix_length,trashinfo_suffix)) { ERR("pidl at %p is not a valid recycle bin entry\n",pidl); return E_INVALIDARG; } TRASH_UnpackItemID(id,&data); restore_path = wine_get_unix_file_name(data.cFileName); file_path = SHAlloc(max(strlen(home_trash->files_dir),strlen(home_trash->info_dir))+strlen(filename)+1); sprintf(file_path,"%s%s",home_trash->files_dir,filename); file_path[strlen(home_trash->files_dir)+strlen(filename)-suffix_length] = '\0'; if(!rename(file_path,restore_path)) { sprintf(file_path,"%s%s",home_trash->info_dir,filename); if(unlink(file_path)) WARN("failed to delete the trashinfo file %s\n",filename); } else WARN("could not erase %s from the trash (errno=%i)\n",filename,errno); SHFree(file_path); HeapFree(GetProcessHeap(), 0, restore_path); return S_OK; }
CAdminToolsFolder::~CAdminToolsFolder() { TRACE ("-- destroying IShellFolder(%p)\n", this); if (pidlRoot) SHFree(pidlRoot); HeapFree(GetProcessHeap(), 0, szTarget); }
/************************************************************************ * 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; }
/************************************************************************ * 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; }
static void DoNewFolder(ContextMenu *This, IShellView *view) { ISFHelper *helper; IShellFolder_QueryInterface(This->parent, &IID_ISFHelper, (void**)&helper); if (helper) { WCHAR nameW[MAX_PATH]; LPITEMIDLIST pidl; ISFHelper_GetUniqueName(helper, nameW, MAX_PATH); ISFHelper_AddFolder(helper, 0, nameW, &pidl); if (view) { /* if we are in a shellview do labeledit */ IShellView_SelectItem(view, pidl,(SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE |SVSI_FOCUSED|SVSI_SELECT)); } SHFree(pidl); ISFHelper_Release(helper); } }
/************************************************************************** * ISvItemCm_fnRelease */ static ULONG WINAPI ISvItemCm_fnRelease(IContextMenu *iface) { ICOM_THIS(ItemCmImpl, iface); TRACE("(%p)->()\n",This); shell32_ObjCount--; if (!--(This->ref)) { TRACE(" destroying IContextMenu(%p)\n",This); if(This->pSFParent) IShellFolder_Release(This->pSFParent); if(This->pidl) SHFree(This->pidl); /*make sure the pidl is freed*/ _ILFreeaPidl(This->apidl, This->cidl); HeapFree(GetProcessHeap(),0,This); return 0; } return This->ref; }
/************************************************************************* * FileMenu_DeleteAllItems [SHELL32.104] * * NOTES * exported by name */ BOOL WINAPI FileMenu_DeleteAllItems (HMENU hmenu) { MENUITEMINFOW mii; LPFMINFO menudata; int i; TRACE("%p\n", hmenu); ZeroMemory ( &mii, sizeof(MENUITEMINFOW)); mii.cbSize = sizeof(MENUITEMINFOW); mii.fMask = MIIM_SUBMENU|MIIM_DATA; for (i = 0; i < GetMenuItemCount( hmenu ); i++) { GetMenuItemInfoW(hmenu, i, TRUE, &mii ); SHFree((LPFMINFO)mii.dwItemData); if (mii.hSubMenu) FileMenu_Destroy(mii.hSubMenu); } while (DeleteMenu (hmenu, 0, MF_BYPOSITION)){}; menudata = FM_GetMenuInfo(hmenu); menudata->bInitialized = FALSE; return TRUE; }
/************************************************************************** * CPrintersEnum::CreatePrintersEnumList() */ BOOL CPrintersEnum::CreatePrintersEnumList(DWORD dwFlags) { BOOL ret = TRUE; TRACE("(%p)->(flags=0x%08lx) \n", this, dwFlags); /* enumerate the folders */ if (dwFlags & SHCONTF_NONFOLDERS) { DWORD needed = 0, num = 0, i; PRINTER_INFO_4W *pi; EnumPrintersW(PRINTER_ENUM_LOCAL, NULL, 4, NULL, 0, &needed, &num); if (!needed) return ret; pi = (PRINTER_INFO_4W *)HeapAlloc(GetProcessHeap(), 0, needed); if(!EnumPrintersW(PRINTER_ENUM_LOCAL, NULL, 4, (LPBYTE)pi, needed, &needed, &num)) { HeapFree(GetProcessHeap(), 0, pi); return FALSE; } for(i = 0; i < num; i++) { LPITEMIDLIST pidl = _ILCreatePrinterItem(&pi[i]); if (pidl) { if (!AddToEnumList(pidl)) SHFree(pidl); } } HeapFree(GetProcessHeap(), 0, pi); } return ret; }
static void DoOpenExplore(ItemCmImpl *This, HWND hwnd, LPCSTR verb) { UINT i, bFolderFound = FALSE; LPITEMIDLIST pidlFQ; SHELLEXECUTEINFOA sei; /* Find the first item in the list that is not a value. These commands should never be invoked if there isn't at least one folder item in the list.*/ for(i = 0; i<This->cidl; i++) { if(!_ILIsValue(This->apidl[i])) { bFolderFound = TRUE; break; } } if (!bFolderFound) return; pidlFQ = ILCombine(This->pidl, This->apidl[i]); ZeroMemory(&sei, sizeof(sei)); sei.cbSize = sizeof(sei); sei.fMask = SEE_MASK_IDLIST | SEE_MASK_CLASSNAME; sei.lpIDList = pidlFQ; sei.lpClass = "Folder"; sei.hwnd = hwnd; sei.nShow = SW_SHOWNORMAL; sei.lpVerb = verb; ShellExecuteExA(&sei); SHFree(pidlFQ); }
HGLOBAL RenderFILENAMEW (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl) { int size = 0; WCHAR szTemp[MAX_PATH], *szFileName; LPITEMIDLIST pidl; HGLOBAL hGlobal; BOOL bSuccess; TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl); /* get path of combined pidl */ pidl = ILCombine(pidlRoot, apidl[0]); if (!pidl) return 0; bSuccess = SHGetPathFromIDListW(pidl, szTemp); SHFree(pidl); if (!bSuccess) return 0; size = (strlenW(szTemp)+1) * sizeof(WCHAR); /* fill the structure */ hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size); if(!hGlobal) return hGlobal; szFileName = (WCHAR *)GlobalLock(hGlobal); memcpy(szFileName, szTemp, size); GlobalUnlock(hGlobal); return hGlobal; }
HRESULT TRASH_EraseItem(LPCITEMIDLIST pidl) { int suffix_length = strlen(trashinfo_suffix); LPCSHITEMID id = &(pidl->mkid); const char *bucket_name = (const char*)(id->abID+1+sizeof(WIN32_FIND_DATAW)); const char *filename = (const char*)(id->abID+1+sizeof(WIN32_FIND_DATAW)+strlen(bucket_name)+1); char *file_path; TRACE("(%p)\n",pidl); if(strcmp(filename+strlen(filename)-suffix_length,trashinfo_suffix)) { ERR("pidl at %p is not a valid recycle bin entry\n",pidl); return E_INVALIDARG; } file_path = SHAlloc(max(strlen(home_trash->files_dir),strlen(home_trash->info_dir))+strlen(filename)+1); sprintf(file_path,"%s%s",home_trash->info_dir,filename); if(unlink(file_path)) WARN("failed to delete the trashinfo file %s\n",filename); sprintf(file_path,"%s%s",home_trash->files_dir,filename); file_path[strlen(home_trash->files_dir)+strlen(filename)-suffix_length] = '\0'; if(unlink(file_path)) WARN("could not erase %s from the trash (errno=%i)\n",filename,errno); SHFree(file_path); return S_OK; }
BOOL WINAPI CBSearchRecycleBin(IN PVOID Context, IN HANDLE hDeletedFile) { PSEARCH_CONTEXT pContext = (PSEARCH_CONTEXT)Context; PDELETED_FILE_DETAILS_W pFileDetails; DWORD dwSize; BOOL ret; if (!GetDeletedFileDetailsW(hDeletedFile, 0, NULL, &dwSize) && GetLastError() != ERROR_INSUFFICIENT_BUFFER) { ERR("GetDeletedFileDetailsW failed\n"); return FALSE; } pFileDetails = (DELETED_FILE_DETAILS_W *)SHAlloc(dwSize); if (!pFileDetails) { ERR("No memory\n"); return FALSE; } if (!GetDeletedFileDetailsW(hDeletedFile, dwSize, pFileDetails, NULL)) { ERR("GetDeletedFileDetailsW failed\n"); SHFree(pFileDetails); return FALSE; } ret = memcmp(pFileDetails, pContext->pFileDetails, dwSize); if (!ret) { pContext->hDeletedFile = hDeletedFile; pContext->bFound = TRUE; } else CloseRecycleBinHandle(hDeletedFile); SHFree(pFileDetails); return ret; }
/************************************************************************ * 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; }
/***************************************************************************** * SIC_IconAppend [internal] * * NOTES * appends an icon pair to the end of the cache */ static INT SIC_IconAppend (LPCWSTR sSourceFile, INT dwSourceIndex, HICON hSmallIcon, HICON hBigIcon, DWORD dwFlags) { LPSIC_ENTRY lpsice; INT ret, index, index1, indexDPA; WCHAR path[MAX_PATH]; TRACE("%s %i %p %p\n", debugstr_w(sSourceFile), dwSourceIndex, hSmallIcon ,hBigIcon); lpsice = (LPSIC_ENTRY) SHAlloc (sizeof (SIC_ENTRY)); GetFullPathNameW(sSourceFile, MAX_PATH, path, NULL); lpsice->sSourceFile = (LPWSTR)HeapAlloc( GetProcessHeap(), 0, (wcslen(path)+1)*sizeof(WCHAR) ); wcscpy( lpsice->sSourceFile, path ); lpsice->dwSourceIndex = dwSourceIndex; lpsice->dwFlags = dwFlags; EnterCriticalSection(&SHELL32_SicCS); indexDPA = DPA_Search (sic_hdpa, lpsice, 0, SIC_CompareEntries, 0, DPAS_SORTED|DPAS_INSERTAFTER); indexDPA = DPA_InsertPtr(sic_hdpa, indexDPA, lpsice); if ( -1 == indexDPA ) { ret = INVALID_INDEX; goto leave; } index = ImageList_AddIcon (ShellSmallIconList, hSmallIcon); index1= ImageList_AddIcon (ShellBigIconList, hBigIcon); /* Something went wrong when allocating a new image in the list. Abort. */ if((index == -1) || (index1 == -1)) { WARN("Something went wrong when adding the icon to the list: small - 0x%x, big - 0x%x.\n", index, index1); if(index != -1) ImageList_Remove(ShellSmallIconList, index); if(index1 != -1) ImageList_Remove(ShellBigIconList, index1); ret = INVALID_INDEX; goto leave; } if (index!=index1) { FIXME("iconlists out of sync 0x%x 0x%x\n", index, index1); /* What to do ???? */ } lpsice->dwListIndex = index; ret = lpsice->dwListIndex; leave: if(ret == INVALID_INDEX) { if(indexDPA != -1) DPA_DeletePtr(sic_hdpa, indexDPA); HeapFree(GetProcessHeap(), 0, lpsice->sSourceFile); SHFree(lpsice); } LeaveCriticalSection(&SHELL32_SicCS); return ret; }
/************************************************************************** * DeleteList() */ static BOOL DeleteList( IEnumIDList * iface) { IEnumIDListImpl *This = (IEnumIDListImpl *)iface; LPENUMLIST pDelete; TRACE("(%p)->()\n",This); while(This->mpFirst) { pDelete = This->mpFirst; This->mpFirst = pDelete->pNext; SHFree(pDelete->pidl); SHFree(pDelete); } This->mpFirst = This->mpLast = This->mpCurrent = NULL; return TRUE; }
void XDG_FreeParsedFile(XDG_PARSED_FILE *parsed) { PARSED_GROUP *group, *next; if (!parsed) return; free_entries_list(parsed->head_comments); group = parsed->groups; while (group) { next = group->next; free_entries_list(group->entries); SHFree(group); group = next; } SHFree(parsed->contents); SHFree(parsed); }
/************************************************************************** * DeleteList() */ BOOL IEnumIDListImpl::DeleteList() { ENUMLIST *pDelete; TRACE("(%p)->()\n", this); while (mpFirst) { pDelete = mpFirst; mpFirst = pDelete->pNext; SHFree(pDelete->pidl); SHFree(pDelete); } mpFirst = NULL; mpLast = NULL; mpCurrent = NULL; return TRUE; }
HRESULT TRASH_EnumItems(const WCHAR *path, LPITEMIDLIST **pidls, int *count) { int ti_count; int pos=0, i; HRESULT err = E_OUTOFMEMORY; HDPA tinfs; if(path) FIXME("Ignoring path = %s\n", debugstr_w(path)); if (!TRASH_EnsureInitialized()) return E_FAIL; tinfs = enum_bucket_trashinfos(home_trash, &ti_count); if (tinfs == NULL) return E_FAIL; *pidls = SHAlloc(sizeof(LPITEMIDLIST)*ti_count); if (!*pidls) goto failed; for (i=0; i<ti_count; i++) { WIN32_FIND_DATAW data; LPCSTR filename; filename = DPA_GetPtr(tinfs, i); if (FAILED(err = TRASH_GetDetails(home_trash, filename, &data))) goto failed; if (err == S_FALSE) continue; if (FAILED(err = TRASH_CreateSimplePIDL(filename, &data, &(*pidls)[pos]))) goto failed; pos++; } *count = pos; DPA_DestroyCallback(tinfs, free_item_callback, NULL); return S_OK; failed: if (*pidls != NULL) { int j; for (j=0; j<pos; j++) SHFree((*pidls)[j]); SHFree(*pidls); } DPA_DestroyCallback(tinfs, free_item_callback, NULL); return err; }
ULONG WINAPI CEnumIDList::Release() { LPENUMLIST pDelete; ULONG refCount = InterlockedDecrement(&ref); if (!refCount) { while (mpFirst) { pDelete = mpFirst; mpFirst = pDelete->pNext; SHFree(pDelete->pidl); SHFree(pDelete); } delete this; } return refCount; }
static INT BrsFolder_OnDestroy(browse_info *info) { if (info->layout) { SHFree(info->layout); info->layout = NULL; } return 0; }