ChangeLog -- Plug a bunch of memory leaks -- Make rages_destroy behave more like free() -- Fix messed up indentation from tabs set to 4 chars -- Updated the documentation Index: dlls/comctl32/listview.c =================================================================== RCS file: /var/cvs/wine/dlls/comctl32/listview.c,v retrieving revision 1.332 diff -u -r1.332 listview.c --- dlls/comctl32/listview.c 2 Dec 2002 18:11:00 -0000 1.332 +++ dlls/comctl32/listview.c 10 Dec 2002 06:38:38 -0000 @@ -45,13 +45,15 @@ * -- LVA_SNAPTOGRID not implemented * -- LISTVIEW_ApproximateViewRect partially implemented * -- LISTVIEW_[GS]etColumnOrderArray stubs - * -- LISTVIEW_GetNextItem is very inefficient * -- LISTVIEW_SetColumnWidth ignores header images & bitmap * -- LISTVIEW_SetIconSpacing is incomplete * -- LISTVIEW_SortItems is broken * -- LISTVIEW_StyleChanged doesn't handle some changes too well * * Speedups + * -- LISTVIEW_GetNextItem needs to be rewritten. It is currently + * linear in the number of items in the list, and this is + * unacceptable for large lists. * -- in sorted mode, LISTVIEW_InsertItemT sorts the array, * instead of inserting in the right spot * -- we should keep an ordered array of coordinates in iconic mode @@ -785,16 +787,16 @@ if (convertToAnsi) { - if (notificationCode != LVN_GETDISPINFOW) - { + if (notificationCode != LVN_GETDISPINFOW) + { cchTempBufMax = WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, NULL, 0, NULL, NULL); } - else - { - cchTempBufMax = pdi->item.cchTextMax; - *pdi->item.pszText = 0; /* make sure we don't process garbage */ - } + else + { + cchTempBufMax = pdi->item.cchTextMax; + *pdi->item.pszText = 0; /* make sure we don't process garbage */ + } pszTempBuf = HeapAlloc(GetProcessHeap(), 0, sizeof(CHAR) * cchTempBufMax); @@ -1016,7 +1018,7 @@ */ static inline void iterator_destroy(ITERATOR* i) { - if (i->ranges) ranges_destroy(i->ranges); + ranges_destroy(i->ranges); } /*** @@ -2423,6 +2425,7 @@ static void ranges_destroy(RANGES ranges) { + if (!ranges) return; ranges_clear(ranges); DPA_Destroy(ranges->hdpa); COMCTL32_Free(ranges); @@ -2446,7 +2449,7 @@ fail: TRACE ("clone failed\n"); - if (clone) ranges_destroy(clone); + ranges_destroy(clone); return NULL; } @@ -7013,6 +7016,7 @@ WS_CHILD | HDS_HORZ | (DWORD)((LVS_NOSORTHEADER & lpcs->style)?0:HDS_BUTTONS), 0, 0, 0, 0, hwnd, NULL, lpcs->hInstance, NULL); + if (!infoPtr->hwndHeader) goto fail; /* set header unicode format */ SendMessageW(infoPtr->hwndHeader, HDM_SETUNICODEFORMAT, (WPARAM)TRUE, (LPARAM)NULL); @@ -7020,15 +7024,12 @@ /* set header font */ SendMessageW(infoPtr->hwndHeader, WM_SETFONT, (WPARAM)infoPtr->hFont, (LPARAM)TRUE); - /* allocate memory for the selection ranges */ - if (!(infoPtr->selectionRanges = ranges_create(10))) return -1; - /* allocate memory for the data structure */ - /* FIXME: what if we fail? */ - infoPtr->hdpaItems = DPA_Create(10); - infoPtr->hdpaPosX = DPA_Create(10); - infoPtr->hdpaPosY = DPA_Create(10); - infoPtr->hdpaColumns = DPA_Create(10); + if (!(infoPtr->selectionRanges = ranges_create(10))) goto fail; + if (!(infoPtr->hdpaItems = DPA_Create(10))) goto fail; + if (!(infoPtr->hdpaPosX = DPA_Create(10))) goto fail; + if (!(infoPtr->hdpaPosY = DPA_Create(10))) goto fail; + if (!(infoPtr->hdpaColumns = DPA_Create(10))) goto fail; /* initialize the icon sizes */ set_icon_size(&infoPtr->iconSize, infoPtr->himlNormal, uView != LVS_ICON); @@ -7052,6 +7053,16 @@ } return 0; + +fail: + DestroyWindow(infoPtr->hwndHeader); + ranges_destroy(infoPtr->selectionRanges); + DPA_Destroy(infoPtr->hdpaItems); + DPA_Destroy(infoPtr->hdpaPosX); + DPA_Destroy(infoPtr->hdpaPosY); + DPA_Destroy(infoPtr->hdpaColumns); + COMCTL32_Free(infoPtr); + return -1; } /*** @@ -7656,7 +7667,10 @@ /* destroy data structure */ DPA_Destroy(infoPtr->hdpaItems); - if (infoPtr->selectionRanges) ranges_destroy(infoPtr->selectionRanges); + DPA_Destroy(infoPtr->hdpaPosX); + DPA_Destroy(infoPtr->hdpaPosY); + DPA_Destroy(infoPtr->hdpaColumns); + ranges_destroy(infoPtr->selectionRanges); /* destroy image lists */ if (!(infoPtr->dwStyle & LVS_SHAREIMAGELISTS)) @@ -8726,7 +8740,6 @@ { SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE); - /* FIXME: why do we need this here? */ LISTVIEW_UpdateSize(infoPtr); LISTVIEW_UpdateScroll(infoPtr); } -- Dimi.