Module: wine Branch: master Commit: 571159d5ff416603b7e4cc381bd5eeaf3ade0351 URL: http://source.winehq.org/git/wine.git/?a=commit;h=571159d5ff416603b7e4cc381b...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sat Mar 6 23:47:59 2010 +0300
shell32/shellview: Improve error handling on some helpers, fix possible leak.
---
dlls/shell32/shlview.c | 138 ++++++++++++++++++++++++------------------------ 1 files changed, 69 insertions(+), 69 deletions(-)
diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c index 80c4c3a..ae133a0 100644 --- a/dlls/shell32/shlview.c +++ b/dlls/shell32/shlview.c @@ -634,96 +634,96 @@ static INT CALLBACK fill_list( LPVOID ptr, LPVOID arg ) return TRUE; }
-static HRESULT ShellView_FillList(IShellViewImpl * This) +static HRESULT ShellView_FillList(IShellViewImpl *This) { - LPENUMIDLIST pEnumIDList; - LPITEMIDLIST pidl; - DWORD dwFetched; - HRESULT hRes; - HDPA hdpa; - - TRACE("%p\n",This); - - /* get the itemlist from the shfolder*/ - hRes = IShellFolder_EnumObjects(This->pSFParent,This->hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList); - if (hRes != S_OK) - { - if (hRes==S_FALSE) - return(NOERROR); - return(hRes); - } + LPENUMIDLIST pEnumIDList; + LPITEMIDLIST pidl; + DWORD fetched; + HRESULT hr; + HDPA hdpa;
- /* create a pointer array */ - hdpa = DPA_Create(16); - if (!hdpa) - { - return(E_OUTOFMEMORY); - } + TRACE("(%p)\n", This);
- /* copy the items into the array*/ - while((S_OK == IEnumIDList_Next(pEnumIDList,1, &pidl, &dwFetched)) && dwFetched) - { - if (DPA_InsertPtr(hdpa, 0x7fff, pidl) == -1) - { - SHFree(pidl); - } - } + /* get the itemlist from the shfolder*/ + hr = IShellFolder_EnumObjects(This->pSFParent, This->hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList); + if (hr != S_OK) return hr;
- /* sort the array */ - DPA_Sort(hdpa, ShellView_CompareItems, (LPARAM)This->pSFParent); + /* create a pointer array */ + hdpa = DPA_Create(16); + if (!hdpa) + { + IEnumIDList_Release(pEnumIDList); + return E_OUTOFMEMORY; + }
- /*turn the listview's redrawing off*/ - SendMessageA(This->hWndList, WM_SETREDRAW, FALSE, 0); + /* copy the items into the array*/ + while((S_OK == IEnumIDList_Next(pEnumIDList, 1, &pidl, &fetched)) && fetched) + { + if (DPA_InsertPtr(hdpa, DPA_GetPtrCount(hdpa), pidl) == -1) + { + SHFree(pidl); + } + }
- DPA_DestroyCallback( hdpa, fill_list, This ); + /* sort the array */ + DPA_Sort(hdpa, ShellView_CompareItems, (LPARAM)This->pSFParent);
- /*turn the listview's redrawing back on and force it to draw*/ - SendMessageA(This->hWndList, WM_SETREDRAW, TRUE, 0); + SendMessageW(This->hWndList, WM_SETREDRAW, FALSE, 0); + DPA_DestroyCallback(hdpa, fill_list, This); + SendMessageW(This->hWndList, WM_SETREDRAW, TRUE, 0);
- IEnumIDList_Release(pEnumIDList); /* destroy the list*/ + IEnumIDList_Release(pEnumIDList);
- return S_OK; + return S_OK; }
/********************************************************** * ShellView_OnCreate() */ -static LRESULT ShellView_OnCreate(IShellViewImpl * This) +static LRESULT ShellView_OnCreate(IShellViewImpl *This) { - IDropTarget* pdt; - SHChangeNotifyEntry ntreg; - IPersistFolder2 * ppf2 = NULL; + IShellView2 *iface = (IShellView2*)This; + IPersistFolder2 *ppf2; + IDropTarget* pdt; + HRESULT hr;
- TRACE("%p\n",This); + TRACE("(%p)\n", This);
- if(ShellView_CreateList(This)) - { - if(ShellView_InitList(This)) - { + if (ShellView_CreateList(This)) + { + if (ShellView_InitList(This)) + { ShellView_FillList(This); - } - } + } + }
- if (SUCCEEDED(IUnknown_QueryInterface((IUnknown*)&This->lpVtbl, &IID_IDropTarget, (LPVOID*)&pdt))) - { - RegisterDragDrop(This->hWnd, pdt); - IDropTarget_Release(pdt); - } + hr = IShellView2_QueryInterface(iface, &IID_IDropTarget, (LPVOID*)&pdt); + if (hr == S_OK) + { + RegisterDragDrop(This->hWnd, pdt); + IDropTarget_Release(pdt); + }
- /* register for receiving notifications */ - IShellFolder_QueryInterface(This->pSFParent, &IID_IPersistFolder2, (LPVOID*)&ppf2); - if (ppf2) - { - IPersistFolder2_GetCurFolder(ppf2, (LPITEMIDLIST*)&ntreg.pidl); - ntreg.fRecursive = TRUE; - This->hNotify = SHChangeNotifyRegister(This->hWnd, SHCNF_IDLIST, SHCNE_ALLEVENTS, SHV_CHANGE_NOTIFY, 1, &ntreg); - SHFree((LPITEMIDLIST)ntreg.pidl); - IPersistFolder2_Release(ppf2); - } + /* register for receiving notifications */ + hr = IShellFolder_QueryInterface(This->pSFParent, &IID_IPersistFolder2, (LPVOID*)&ppf2); + if (hr == S_OK) + { + SHChangeNotifyEntry ntreg;
- This->hAccel = LoadAcceleratorsA(shell32_hInstance, "shv_accel"); + hr = IPersistFolder2_GetCurFolder(ppf2, (LPITEMIDLIST*)&ntreg.pidl); + if (hr == S_OK) + { + ntreg.fRecursive = TRUE; + This->hNotify = SHChangeNotifyRegister(This->hWnd, SHCNF_IDLIST, SHCNE_ALLEVENTS, + SHV_CHANGE_NOTIFY, 1, &ntreg); + SHFree((LPITEMIDLIST)ntreg.pidl); + } + IPersistFolder2_Release(ppf2); + }
- return S_OK; + This->hAccel = LoadAcceleratorsA(shell32_hInstance, "shv_accel"); + + return S_OK; }
/********************************************************** @@ -1875,7 +1875,7 @@ static HRESULT WINAPI IShellView_fnRefresh(IShellView2 * iface) { IShellViewImpl *This = (IShellViewImpl *)iface;
- TRACE("(%p)\n",This); + TRACE("(%p)\n", This);
SendMessageW(This->hWndList, LVM_DELETEALLITEMS, 0, 0); ShellView_FillList(This);