mirror of
https://github.com/reactos/reactos.git
synced 2025-04-28 01:11:35 +00:00
- build up test data for each node in the treeview and tag it
- traverse the tree recursively and free all data on close svn path=/trunk/; revision=34033
This commit is contained in:
parent
25f5cca19d
commit
938f407a80
2 changed files with 141 additions and 18 deletions
|
@ -13,6 +13,9 @@
|
|||
#define IL_MAIN 0
|
||||
#define IL_TEST 1
|
||||
|
||||
#define HAS_NO_CHILD 0
|
||||
#define HAS_CHILD 1
|
||||
|
||||
typedef wchar_t *(__cdecl *DLLNAME)();
|
||||
typedef int (_cdecl *MODULES)(char **);
|
||||
|
||||
|
@ -102,12 +105,86 @@ GetListOfTestDlls(PMAIN_WND_INFO pInfo)
|
|||
return numFiles;
|
||||
}
|
||||
|
||||
static BOOL
|
||||
NodeHasChild(PMAIN_WND_INFO pInfo,
|
||||
HTREEITEM hItem)
|
||||
{
|
||||
TV_ITEM tvItem;
|
||||
|
||||
tvItem.hItem = hItem;
|
||||
tvItem.mask = TVIF_CHILDREN;
|
||||
|
||||
(void)TreeView_GetItem(pInfo->hBrowseTV, &tvItem);
|
||||
|
||||
return (tvItem.cChildren == 1);
|
||||
}
|
||||
|
||||
static VOID
|
||||
FreeItemTag(PMAIN_WND_INFO pInfo,
|
||||
HTREEITEM hItem)
|
||||
{
|
||||
TV_ITEM tvItem;
|
||||
WCHAR buf[256];
|
||||
|
||||
tvItem.hItem = hItem;
|
||||
tvItem.mask = TVIF_PARAM | TVIF_TEXT;
|
||||
tvItem.pszText = buf;
|
||||
|
||||
(void)TreeView_GetItem(pInfo->hBrowseTV, &tvItem);
|
||||
|
||||
HeapFree(GetProcessHeap(),
|
||||
0,
|
||||
(PTEST_ITEM)tvItem.lParam);
|
||||
}
|
||||
|
||||
static VOID
|
||||
TraverseTreeView(PMAIN_WND_INFO pInfo,
|
||||
HTREEITEM hItem)
|
||||
{
|
||||
while (NodeHasChild(pInfo, hItem))
|
||||
{
|
||||
HTREEITEM hChildItem;
|
||||
|
||||
hChildItem = TreeView_GetChild(pInfo->hBrowseTV,
|
||||
hItem);
|
||||
|
||||
TraverseTreeView(pInfo,
|
||||
hChildItem);
|
||||
|
||||
hItem = TreeView_GetNextSibling(pInfo->hBrowseTV,
|
||||
hItem);
|
||||
}
|
||||
|
||||
if (hItem)
|
||||
{
|
||||
/* loop the child items and free the tags */
|
||||
while (TRUE)
|
||||
{
|
||||
HTREEITEM hOldItem;
|
||||
|
||||
FreeItemTag(pInfo, hItem);
|
||||
hOldItem = hItem;
|
||||
hItem = TreeView_GetNextSibling(pInfo->hBrowseTV,
|
||||
hItem);
|
||||
if (hItem == NULL)
|
||||
{
|
||||
hItem = hOldItem;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
hItem = TreeView_GetParent(pInfo->hBrowseTV,
|
||||
hItem);
|
||||
}
|
||||
}
|
||||
|
||||
static HTREEITEM
|
||||
InsertIntoTreeView(HWND hTreeView,
|
||||
HTREEITEM hRoot,
|
||||
LPWSTR lpLabel,
|
||||
LPWSTR lpDllPath,
|
||||
INT Image)
|
||||
LPARAM Tag,
|
||||
INT Image,
|
||||
INT Child)
|
||||
{
|
||||
TV_ITEM tvi;
|
||||
TV_INSERTSTRUCT tvins;
|
||||
|
@ -115,14 +192,13 @@ InsertIntoTreeView(HWND hTreeView,
|
|||
ZeroMemory(&tvi, sizeof(tvi));
|
||||
ZeroMemory(&tvins, sizeof(tvins));
|
||||
|
||||
tvi.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
|
||||
tvi.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_CHILDREN | TVIF_SELECTEDIMAGE;
|
||||
tvi.pszText = lpLabel;
|
||||
tvi.cchTextMax = lstrlen(lpLabel);
|
||||
tvi.lParam = (LPARAM)lpDllPath;
|
||||
tvi.lParam = Tag;
|
||||
tvi.iImage = Image;
|
||||
tvi.iSelectedImage = Image;
|
||||
|
||||
//tvi.stateMask = TVIS_OVERLAYMASK;
|
||||
tvi.cChildren = Child;
|
||||
|
||||
tvins.item = tvi;
|
||||
tvins.hParent = hRoot;
|
||||
|
@ -130,6 +206,24 @@ InsertIntoTreeView(HWND hTreeView,
|
|||
return TreeView_InsertItem(hTreeView, &tvins);
|
||||
}
|
||||
|
||||
static PTEST_ITEM
|
||||
BuildTestItemData(LPWSTR lpDll,
|
||||
LPWSTR lpRun)
|
||||
{
|
||||
PTEST_ITEM pItem;
|
||||
|
||||
pItem = (PTEST_ITEM)HeapAlloc(GetProcessHeap(),
|
||||
0,
|
||||
sizeof(TEST_ITEM));
|
||||
if (pItem)
|
||||
{
|
||||
wcsncpy(pItem->szSelectedDll, lpDll, MAX_PATH);
|
||||
wcsncpy(pItem->szRunString, lpRun, MAX_RUN_CMD);
|
||||
}
|
||||
|
||||
return pItem;
|
||||
}
|
||||
|
||||
static VOID
|
||||
PopulateTreeView(PMAIN_WND_INFO pInfo)
|
||||
{
|
||||
|
@ -160,8 +254,9 @@ PopulateTreeView(PMAIN_WND_INFO pInfo)
|
|||
hRoot = InsertIntoTreeView(pInfo->hBrowseTV,
|
||||
NULL,
|
||||
L"Full",
|
||||
NULL,
|
||||
IL_MAIN);
|
||||
0,
|
||||
IL_MAIN,
|
||||
HAS_CHILD);
|
||||
|
||||
for (i = 0; i < pInfo->numDlls; i++)
|
||||
{
|
||||
|
@ -177,34 +272,47 @@ PopulateTreeView(PMAIN_WND_INFO pInfo)
|
|||
LPSTR lpModules, ptr;
|
||||
LPWSTR lpModW;
|
||||
INT numMods;
|
||||
PTEST_ITEM pTestItem;
|
||||
|
||||
lpTestName = GetTestName();
|
||||
|
||||
pTestItem = BuildTestItemData(lpDllPath, lpTestName);
|
||||
|
||||
hParent = InsertIntoTreeView(pInfo->hBrowseTV,
|
||||
hRoot,
|
||||
lpTestName,
|
||||
lpDllPath,
|
||||
IL_TEST);
|
||||
|
||||
pTestItem,
|
||||
IL_TEST,
|
||||
HAS_CHILD);
|
||||
if (hParent)
|
||||
{
|
||||
/* Get the list of modules a dll offers. This is returned as list of
|
||||
* Ansi null-terminated strings, terminated with an empty string (double null) */
|
||||
GetModulesInTest = (MODULES)GetProcAddress(hDll, "GetModulesInTest");
|
||||
if ((numMods = GetModulesInTest(&lpModules)))
|
||||
{
|
||||
ptr = lpModules;
|
||||
while (numMods && *ptr != '\0')
|
||||
{
|
||||
/* convert the string to unicode */
|
||||
if (AnsiToUnicode(ptr, &lpModW))
|
||||
{
|
||||
WCHAR szRunCmd[MAX_RUN_CMD];
|
||||
|
||||
_snwprintf(szRunCmd, MAX_RUN_CMD, L"%s:%s", lpTestName, lpModW);
|
||||
pTestItem = BuildTestItemData(lpDllPath, szRunCmd);
|
||||
|
||||
InsertIntoTreeView(pInfo->hBrowseTV,
|
||||
hParent,
|
||||
lpModW,
|
||||
lpModW,
|
||||
IL_TEST);
|
||||
pTestItem,
|
||||
IL_TEST,
|
||||
HAS_NO_CHILD);
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, lpModW);
|
||||
}
|
||||
|
||||
/* move onto next string */
|
||||
while (*(ptr++) != '\0')
|
||||
;
|
||||
|
||||
|
@ -288,6 +396,15 @@ BrowseDlgProc(HWND hDlg,
|
|||
break;
|
||||
}
|
||||
|
||||
case WM_DESTROY:
|
||||
{
|
||||
HTREEITEM hItem = TreeView_GetRoot(pInfo->hBrowseTV);
|
||||
|
||||
TraverseTreeView(pInfo, hItem);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
HandleDefaultMessage:
|
||||
default:
|
||||
return FALSE;
|
||||
|
|
|
@ -9,6 +9,15 @@
|
|||
|
||||
extern HINSTANCE hInstance;
|
||||
|
||||
#define MAX_RUN_CMD 256
|
||||
|
||||
typedef struct _TEST_ITEM
|
||||
{
|
||||
WCHAR szSelectedDll[MAX_PATH];
|
||||
WCHAR szRunString[MAX_RUN_CMD];
|
||||
|
||||
} TEST_ITEM, *PTEST_ITEM;
|
||||
|
||||
typedef struct _MAIN_WND_INFO
|
||||
{
|
||||
HWND hMainWnd;
|
||||
|
@ -20,14 +29,11 @@ typedef struct _MAIN_WND_INFO
|
|||
HICON hSmIcon;
|
||||
HICON hBgIcon;
|
||||
|
||||
INT SelectedItem;/* selection number in the list view */
|
||||
BOOL bDlgOpen;
|
||||
BOOL bInMenuLoop;
|
||||
BOOL bIsUserAnAdmin;
|
||||
|
||||
LPWSTR lpDllList;
|
||||
INT numDlls;
|
||||
|
||||
PTEST_ITEM SelectedTest;
|
||||
|
||||
} MAIN_WND_INFO, *PMAIN_WND_INFO;
|
||||
|
||||
/* dll exports */
|
||||
|
|
Loading…
Reference in a new issue