- 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:
Ged Murphy 2008-06-20 08:21:49 +00:00
parent 25f5cca19d
commit 938f407a80
2 changed files with 141 additions and 18 deletions

View file

@ -13,6 +13,9 @@
#define IL_MAIN 0 #define IL_MAIN 0
#define IL_TEST 1 #define IL_TEST 1
#define HAS_NO_CHILD 0
#define HAS_CHILD 1
typedef wchar_t *(__cdecl *DLLNAME)(); typedef wchar_t *(__cdecl *DLLNAME)();
typedef int (_cdecl *MODULES)(char **); typedef int (_cdecl *MODULES)(char **);
@ -102,12 +105,86 @@ GetListOfTestDlls(PMAIN_WND_INFO pInfo)
return numFiles; 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 static HTREEITEM
InsertIntoTreeView(HWND hTreeView, InsertIntoTreeView(HWND hTreeView,
HTREEITEM hRoot, HTREEITEM hRoot,
LPWSTR lpLabel, LPWSTR lpLabel,
LPWSTR lpDllPath, LPARAM Tag,
INT Image) INT Image,
INT Child)
{ {
TV_ITEM tvi; TV_ITEM tvi;
TV_INSERTSTRUCT tvins; TV_INSERTSTRUCT tvins;
@ -115,14 +192,13 @@ InsertIntoTreeView(HWND hTreeView,
ZeroMemory(&tvi, sizeof(tvi)); ZeroMemory(&tvi, sizeof(tvi));
ZeroMemory(&tvins, sizeof(tvins)); 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.pszText = lpLabel;
tvi.cchTextMax = lstrlen(lpLabel); tvi.cchTextMax = lstrlen(lpLabel);
tvi.lParam = (LPARAM)lpDllPath; tvi.lParam = Tag;
tvi.iImage = Image; tvi.iImage = Image;
tvi.iSelectedImage = Image; tvi.iSelectedImage = Image;
tvi.cChildren = Child;
//tvi.stateMask = TVIS_OVERLAYMASK;
tvins.item = tvi; tvins.item = tvi;
tvins.hParent = hRoot; tvins.hParent = hRoot;
@ -130,6 +206,24 @@ InsertIntoTreeView(HWND hTreeView,
return TreeView_InsertItem(hTreeView, &tvins); 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 static VOID
PopulateTreeView(PMAIN_WND_INFO pInfo) PopulateTreeView(PMAIN_WND_INFO pInfo)
{ {
@ -160,8 +254,9 @@ PopulateTreeView(PMAIN_WND_INFO pInfo)
hRoot = InsertIntoTreeView(pInfo->hBrowseTV, hRoot = InsertIntoTreeView(pInfo->hBrowseTV,
NULL, NULL,
L"Full", L"Full",
NULL, 0,
IL_MAIN); IL_MAIN,
HAS_CHILD);
for (i = 0; i < pInfo->numDlls; i++) for (i = 0; i < pInfo->numDlls; i++)
{ {
@ -177,34 +272,47 @@ PopulateTreeView(PMAIN_WND_INFO pInfo)
LPSTR lpModules, ptr; LPSTR lpModules, ptr;
LPWSTR lpModW; LPWSTR lpModW;
INT numMods; INT numMods;
PTEST_ITEM pTestItem;
lpTestName = GetTestName(); lpTestName = GetTestName();
pTestItem = BuildTestItemData(lpDllPath, lpTestName);
hParent = InsertIntoTreeView(pInfo->hBrowseTV, hParent = InsertIntoTreeView(pInfo->hBrowseTV,
hRoot, hRoot,
lpTestName, lpTestName,
lpDllPath, pTestItem,
IL_TEST); IL_TEST,
HAS_CHILD);
if (hParent) 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"); GetModulesInTest = (MODULES)GetProcAddress(hDll, "GetModulesInTest");
if ((numMods = GetModulesInTest(&lpModules))) if ((numMods = GetModulesInTest(&lpModules)))
{ {
ptr = lpModules; ptr = lpModules;
while (numMods && *ptr != '\0') while (numMods && *ptr != '\0')
{ {
/* convert the string to unicode */
if (AnsiToUnicode(ptr, &lpModW)) 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, InsertIntoTreeView(pInfo->hBrowseTV,
hParent, hParent,
lpModW, lpModW,
lpModW, pTestItem,
IL_TEST); IL_TEST,
HAS_NO_CHILD);
HeapFree(GetProcessHeap(), 0, lpModW); HeapFree(GetProcessHeap(), 0, lpModW);
} }
/* move onto next string */
while (*(ptr++) != '\0') while (*(ptr++) != '\0')
; ;
@ -288,6 +396,15 @@ BrowseDlgProc(HWND hDlg,
break; break;
} }
case WM_DESTROY:
{
HTREEITEM hItem = TreeView_GetRoot(pInfo->hBrowseTV);
TraverseTreeView(pInfo, hItem);
break;
}
HandleDefaultMessage: HandleDefaultMessage:
default: default:
return FALSE; return FALSE;

View file

@ -9,6 +9,15 @@
extern HINSTANCE hInstance; 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 typedef struct _MAIN_WND_INFO
{ {
HWND hMainWnd; HWND hMainWnd;
@ -20,14 +29,11 @@ typedef struct _MAIN_WND_INFO
HICON hSmIcon; HICON hSmIcon;
HICON hBgIcon; HICON hBgIcon;
INT SelectedItem;/* selection number in the list view */
BOOL bDlgOpen;
BOOL bInMenuLoop;
BOOL bIsUserAnAdmin;
LPWSTR lpDllList; LPWSTR lpDllList;
INT numDlls; INT numDlls;
PTEST_ITEM SelectedTest;
} MAIN_WND_INFO, *PMAIN_WND_INFO; } MAIN_WND_INFO, *PMAIN_WND_INFO;
/* dll exports */ /* dll exports */