mirror of
https://github.com/reactos/reactos.git
synced 2025-07-28 03:52:17 +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_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;
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue