Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1901 lines
33 KiB

/*++ BUILD Version: 0000 // Increment this if a change has global effects
Copyright (c) 1995 Microsoft Corporation
Module Name:
trapper.c
Abstract:
This module contains the src for the trapper (test wrapper) app
Author:
Dan Knudson (DanKn) 06-Jun-1995
Revision History:
Javed Rasool (JavedR) 01-July 1996 Added IDM_KILLTAPISRV (i.e., menu command to Kill Tapisrv.exe)
Also modifed corresponding files: trapper.rc and private.h
Notes:
--*/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <time.h>
#include <commdlg.h>
#include "private.h"
#include "trapper.h"
#ifdef WIN32
#define _export
#define __export
#endif
char szFrameClass [] = "MdiFrame";
char szHelloClass [] = "MdiHelloChild";
HANDLE hInst;
HMENU hMenuInit, hMenuHello;
HMENU hMenuInitWindow, hMenuHelloWindow;
HWND hwndClient, hwndFrame;
char gszTrapperIni[] = ".\\trapper.ini";
int giLogLevel = TRAPP_LOGLEVEL_PARAMS;
DWORD gdwTlsIndex;
MEMORYSTATUS gInitialMemoryStatus;
BOOL
CALLBACK
FrameWndProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam
);
BOOL
FAR
PASCAL
_export
CloseEnumProc(
HWND hwnd,
LONG lParam
);
BOOL
CALLBACK
HelloWndProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam
);
void
TestThread(
PINSTANCE_INFO pInstInfo
);
BOOL
CALLBACK
MemoryStatusWndProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam
);
VOID
ShowStr(
PINSTANCE_INFO pInstInfo,
char far *format,
...
);
void
__export
LogProc(
int level,
char *format,
...
);
int
WINAPI
WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
HANDLE hAccel;
MSG msg;
WNDCLASS wndclass;
hInst = hInstance;
if (!hPrevInstance)
{
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = FrameWndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = GetStockObject (LTGRAY_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szFrameClass;
RegisterClass (&wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = HelloWndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = sizeof (PINSTANCE_INFO);
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = GetStockObject (LTGRAY_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szHelloClass;
RegisterClass (&wndclass);
}
hMenuInit = LoadMenu (hInst, "MdiMenuInit");
hMenuHello = LoadMenu (hInst, "MdiMenuHello");
if (!hMenuInit || !hMenuHello)
{
MessageBox (NULL, "err1", "", MB_OK);
}
hMenuInitWindow = GetSubMenu (hMenuInit, INIT_MENU_POS);
hMenuHelloWindow = GetSubMenu (hMenuHello, HELLO_MENU_POS);
if (!hMenuInitWindow || !hMenuHelloWindow)
{
MessageBox (NULL, "err1", "", MB_OK);
}
hAccel = LoadAccelerators (hInst, "MdiAccel");
hwndFrame = CreateWindow(
szFrameClass,
"Test wRAPPER",
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
hMenuInit,
hInstance,
NULL
);
hwndClient = GetWindow (hwndFrame, GW_CHILD);
ShowWindow (hwndFrame, nCmdShow);
UpdateWindow (hwndFrame);
if ((gdwTlsIndex = TlsAlloc()) == 0xffffffff)
{
// BUGBUG
}
GlobalMemoryStatus (&gInitialMemoryStatus);
while (GetMessage (&msg, NULL, 0, 0))
{
if (!TranslateMDISysAccel (hwndClient, &msg) &&
!TranslateAccelerator (hwndFrame, hAccel, &msg))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
DestroyMenu (hMenuHello);
return msg.wParam;
}
BOOL
CALLBACK
FrameWndProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam
)
{
static HANDLE hTapiLib = (HANDLE) NULL;
CLIENTCREATESTRUCT clientcreate;
FARPROC lpfnEnum;
HWND hwndChild;
MDICREATESTRUCT mdicreate;
switch (msg)
{
case WM_CREATE: // Create the client window
clientcreate.hWindowMenu = hMenuInitWindow ;
clientcreate.idFirstChild = IDM_FIRSTCHILD ;
hwndClient = CreateWindow(
"MDICLIENT",
NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
0,
0,
0,
0,
hwnd,
(HMENU) 1,
hInst,
(LPVOID) &clientcreate
);
return 0;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDM_NEWTESTTHREAD: // Create a Hello child window
mdicreate.szClass = szHelloClass;
mdicreate.szTitle = "Test Thread: stopped";
mdicreate.hOwner = hInst;
mdicreate.x = CW_USEDEFAULT;
mdicreate.y = CW_USEDEFAULT;
mdicreate.cx = CW_USEDEFAULT;
mdicreate.cy = CW_USEDEFAULT;
mdicreate.style = 0;
mdicreate.lParam = 0;
hwndChild = (HWND) SendMessage(
hwndClient,
WM_MDICREATE,
0,
(LPARAM) &mdicreate
);
return 0 ;
case IDM_CLOSE: // Close the active window
hwndChild = (HWND)SendMessage (hwndClient, WM_MDIGETACTIVE, 0, 0L);
if (SendMessage (hwndChild, WM_QUERYENDSESSION, 0, 0L))
{
SendMessage (hwndClient, WM_MDIDESTROY, (WPARAM) hwndChild, 0L);
}
return 0 ;
case IDM_MEMORYSTATUS:
DialogBox(
hInst,
MAKEINTRESOURCE (IDD_DIALOG1),
hwnd,
(DLGPROC) MemoryStatusWndProc
);
break;
case IDM_LOADTAPI:
if (!hTapiLib)
{
if (!(hTapiLib = LoadLibrary ("tapi32.dll")))
{
char buf[64];
wsprintf(
buf,
"LoadLib(tapi32) failed, err=%d",
GetLastError()
);
MessageBox (hwnd, buf, "Trapper: Error", MB_OK);
}
}
break;
case IDM_UNLOADTAPI:
if (hTapiLib)
{
FreeLibrary (hTapiLib);
hTapiLib = (HANDLE) NULL;
}
break;
case IDM_EXIT: // Exit the program
SendMessage (hwnd, WM_CLOSE, 0, 0L) ;
return 0;
case IDM_TILE:
SendMessage (hwndClient, WM_MDITILE, 0, 0L);
return 0;
case IDM_CASCADE:
SendMessage (hwndClient, WM_MDICASCADE, 0, 0L);
return 0;
case IDM_ARRANGE:
SendMessage (hwndClient, WM_MDIICONARRANGE, 0, 0L);
return 0;
case IDM_CLOSEALL:
EnumChildWindows (hwndClient, CloseEnumProc, 0L);
return 0;
case IDM_USAGE:
{
static char szDlgText[] =
"ABSTRACT:\n\r" \
" Trapper is...\n\r" \
"\n\rGETTING STARTED:\n\r" \
" 1. Choose 'File/New Test Thread' to ...\n\r" \
"\n\rMORE INFO:\n\r" \
" * ...\n\r";
MessageBox (hwnd, szDlgText, "Using Trapper", MB_OK);
break;
}
case IDM_ABOUT:
MessageBox (hwnd, "xxx", "About Trapper", MB_OK);
break;
default: // Pass to active child
hwndChild = (HWND) SendMessage(hwndClient, WM_MDIGETACTIVE, 0, 0L);
if (IsWindow (hwndChild))
{
SendMessage (hwndChild, WM_COMMAND, wParam, lParam);
}
break;
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint (hwnd, &ps);
FillRect (ps.hdc, &ps.rcPaint, GetStockObject (LTGRAY_BRUSH));
EndPaint (hwnd, &ps);
break;
}
case WM_QUERYENDSESSION:
case WM_CLOSE: // Attempt to close all children
SendMessage (hwnd, WM_COMMAND, IDM_CLOSEALL, 0L);
if (NULL != GetWindow (hwndClient, GW_CHILD))
{
return 0;
}
break;
case WM_DESTROY:
PostQuitMessage (0);
if (hTapiLib)
{
FreeLibrary (hTapiLib);
}
return 0;
}
// Pass unprocessed messages to DefFrameProc (not DefWindowProc)
return DefFrameProc (hwnd, hwndClient, msg, wParam, lParam);
}
BOOL
FAR
PASCAL
_export
CloseEnumProc(
HWND hwnd,
LONG lParam
)
{
if (GetWindow (hwnd, GW_OWNER)) // check for icon title
{
return 1;
}
SendMessage (GetParent (hwnd), WM_MDIRESTORE, (WPARAM) hwnd, 0L);
if (!SendMessage (hwnd, WM_QUERYENDSESSION, 0, 0L))
{
return 1 ;
}
SendMessage (GetParent (hwnd), WM_MDIDESTROY, (WPARAM) hwnd, 0L);
return 1 ;
}
void
MungeMenuState(
PINSTANCE_INFO pInstInfo
)
{
//
// Check/uncheck the appropriate items given the inst info
//
CheckMenuItem(
hMenuHello,
IDM_STOPONFAILURE,
(pInstInfo->bStopOnFailure ? MF_CHECKED : MF_UNCHECKED) |
MF_BYCOMMAND
);
CheckMenuItem(
hMenuHello,
IDM_RUNONCE,
(pInstInfo->bRunForever ? MF_UNCHECKED : MF_CHECKED) |
MF_BYCOMMAND
);
CheckMenuItem(
hMenuHello,
IDM_RUNFOREVER,
(pInstInfo->bRunForever ? MF_CHECKED : MF_UNCHECKED) |
MF_BYCOMMAND
);
if(giLogLevel == TRAPP_LOGLEVEL_PARAMS)
{
CheckMenuItem(
hMenuHello,
IDM_PARAMS,
MF_CHECKED
);
CheckMenuItem(
hMenuHello,
IDM_NOPARAMS,
MF_UNCHECKED
);
CheckMenuItem(
hMenuHello,
IDM_NOENTEREXIT,
MF_UNCHECKED
);
CheckMenuItem(
hMenuHello,
IDM_PASSONLY,
MF_UNCHECKED
);
}
else if(giLogLevel == TRAPP_LOGLEVEL_NOPARAMS)
{
CheckMenuItem(
hMenuHello,
IDM_PARAMS,
MF_UNCHECKED
);
CheckMenuItem(
hMenuHello,
IDM_NOPARAMS,
MF_CHECKED
);
CheckMenuItem(
hMenuHello,
IDM_NOENTEREXIT,
MF_UNCHECKED
);
CheckMenuItem(
hMenuHello,
IDM_PASSONLY,
MF_UNCHECKED
);
}
else if(giLogLevel == TRAPP_LOGLEVEL_NOENTEREXIT)
{
CheckMenuItem(
hMenuHello,
IDM_PARAMS,
MF_UNCHECKED
);
CheckMenuItem(
hMenuHello,
IDM_NOPARAMS,
MF_UNCHECKED
);
CheckMenuItem(
hMenuHello,
IDM_NOENTEREXIT,
MF_CHECKED
);
CheckMenuItem(
hMenuHello,
IDM_PASSONLY,
MF_UNCHECKED
);
}
else if(giLogLevel == TRAPP_LOGLEVEL_PASSONLY)
{
CheckMenuItem(
hMenuHello,
IDM_PARAMS,
MF_UNCHECKED
);
CheckMenuItem(
hMenuHello,
IDM_NOPARAMS,
MF_UNCHECKED
);
CheckMenuItem(
hMenuHello,
IDM_NOENTEREXIT,
MF_UNCHECKED
);
CheckMenuItem(
hMenuHello,
IDM_PASSONLY,
MF_CHECKED
);
}
CheckMenuItem(
hMenuHello,
IDM_LOGFILE,
(pInstInfo->bLogFile ? MF_CHECKED : MF_UNCHECKED) |
MF_BYCOMMAND
);
//
// Enable/disable the appropriate items given the inst info
//
EnableMenuItem(
hMenuHello,
IDM_START,
(pInstInfo->bTestInProgress ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED)
| MF_BYCOMMAND
);
EnableMenuItem(
hMenuHello,
IDM_STOP,
(pInstInfo->bTestInProgress ? MF_ENABLED : (MF_DISABLED | MF_GRAYED))
| MF_BYCOMMAND
);
EnableMenuItem(
hMenuHello,
IDM_KILLTAPISRV,
(pInstInfo->bTestInProgress ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED)
|MF_BYCOMMAND
);
EnableMenuItem(
hMenuHello,
IDM_RUNONCE,
(pInstInfo->bTestInProgress ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED)
| MF_BYCOMMAND
);
EnableMenuItem(
hMenuHello,
IDM_RUNFOREVER,
(pInstInfo->bTestInProgress ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED)
| MF_BYCOMMAND
);
EnableMenuItem(
hMenuHello,
IDM_STOPONFAILURE,
(pInstInfo->bTestInProgress ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED)
| MF_BYCOMMAND
);
EnableMenuItem(
hMenuHello,
IDM_ALLTESTS,
(pInstInfo->bTestInProgress ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED)
| MF_BYCOMMAND
);
EnableMenuItem(
hMenuHello,
IDM_NOTESTS,
(pInstInfo->bTestInProgress ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED)
| MF_BYCOMMAND
);
EnableMenuItem(
hMenuHello,
IDM_ALLTESTSINSUITE,
(pInstInfo->bTestInProgress ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED)
| MF_BYCOMMAND
);
EnableMenuItem(
hMenuHello,
IDM_NOTESTSINSUITE,
(pInstInfo->bTestInProgress ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED)
| MF_BYCOMMAND
);
EnableMenuItem(
hMenuHello,
IDM_CONFIGSUITE,
(pInstInfo->bTestInProgress ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED)
| MF_BYCOMMAND
);
EnableMenuItem(
hMenuHello,
IDM_ABOUTSUITE,
(pInstInfo->bTestInProgress ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED) | MF_BYCOMMAND
);
}
BOOL
CALLBACK
HelloWndProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam
)
{
HMENU hMenu;
PINSTANCE_INFO pInstInfo = (PINSTANCE_INFO) GetWindowLong (hwnd, 0);
switch (msg)
{
case WM_CREATE:
{
int i;
RECT rect;
pInstInfo = LocalAlloc (LPTR, sizeof(INSTANCE_INFO));
memset (pInstInfo, 0, sizeof (INSTANCE_INFO));
SetWindowLong (hwnd, 0, (LONG) pInstInfo);
pInstInfo->hwnd = hwnd;
pInstInfo->hTextBufMutex = CreateMutex (NULL, FALSE, NULL);
pInstInfo->dwTextBufTotalSize = 2048;
pInstInfo->dwTextBufUsedSize = 0;
pInstInfo->pTextBuf = LocalAlloc (LPTR, pInstInfo->dwTextBufTotalSize);
pInstInfo->pTextBuf[0] = 0;
pInstInfo->hwndList1 = CreateWindow (
"listbox",
"",
WS_VISIBLE | WS_CHILD | WS_BORDER | LBS_NOINTEGRALHEIGHT |
WS_VSCROLL | LBS_HASSTRINGS | LBS_NOTIFY,
0,
0,
0,
0,
hwnd,
(HMENU) IDC_LIST1,
hInst,
NULL
);
pInstInfo->hwndEdit1 = CreateWindow (
"edit",
"",
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_MULTILINE |
ES_AUTOHSCROLL | WS_VSCROLL,
0,
0,
0,
0,
hwnd,
(HMENU) IDC_EDIT1,
hInst,
NULL
);
pInstInfo->hwndEdit2 = CreateWindow (
"edit",
"",
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL,
0,
0,
0,
0,
hwnd,
(HMENU) IDC_EDIT2,
hInst,
NULL
);
pInstInfo->iNumSuites = GetPrivateProfileInt(
"Suites",
"NumSuites",
0,
gszTrapperIni
);
for (i = 0; i < pInstInfo->iNumSuites; i++)
{
#define BUFSIZE 256
int j, iNumTests;
char szSuiteN[16], buf[BUFSIZE];
HWND hwndList;
wsprintf (szSuiteN, "Suite%d", i + 1);
GetPrivateProfileString(
szSuiteN,
"Description",
"<bogus description>",
buf,
BUFSIZE,
gszTrapperIni
);
SendMessage (pInstInfo->hwndList1, LB_ADDSTRING, 0, (LPARAM) buf);
if (!(hwndList = CreateWindow (
"listbox",
"",
WS_CHILD | WS_BORDER | LBS_NOINTEGRALHEIGHT | WS_VSCROLL |
LBS_HASSTRINGS | LBS_MULTIPLESEL | WS_VISIBLE,
0,
0,
0,
0,
hwnd,
NULL,
hInst,
NULL
)))
{
MessageBox (NULL, "CreateWnd failed", "", MB_OK);
}
SendMessage(
pInstInfo->hwndList1,
LB_SETITEMDATA,
i,
(LPARAM) hwndList
);
iNumTests = GetPrivateProfileInt(
szSuiteN,
"NumTests",
0,
gszTrapperIni
);
for (j = 0; j < iNumTests; j++)
{
char szTestN[16];
wsprintf (szTestN, "Test%d", j + 1);
GetPrivateProfileString(
szSuiteN,
szTestN,
"<bogus description>",
buf,
BUFSIZE,
gszTrapperIni
);
SendMessage(
hwndList,
LB_ADDSTRING,
0,
(LPARAM) (strstr (buf, ",") + 1)
);
}
if (i == 0)
{
pInstInfo->hwndList2 = hwndList;
}
}
SendMessage (pInstInfo->hwndList1, LB_SETCURSEL, 0, 0);
GetClientRect (hwnd, &rect);
SendMessage(
hwnd,
WM_SIZE,
0,
MAKELONG((rect.right-rect.left),(rect.bottom-rect.top))
);
CheckMenuItem (hMenuHello, IDM_RUNONCE, MF_CHECKED | MF_BYCOMMAND);
return 0 ;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_EDIT1:
#ifdef WIN32
if (HIWORD(wParam) == EN_CHANGE)
#else
if (HIWORD(lParam) == EN_CHANGE)
#endif
{
//
// Watch to see if the edit control is full, & if so
// purge the top half of the text to make room for more
//
int length = GetWindowTextLength (pInstInfo->hwndEdit1);
if (length > 29998)
{
#ifdef WIN32
SendMessage(
pInstInfo->hwndEdit1,
EM_SETSEL,
(WPARAM) 0,
(LPARAM) 10000
);
#else
SendMessage(
pInstInfo->hwndEdit1,
EM_SETSEL,
(WPARAM) 1,
(LPARAM) MAKELONG (0, 10000)
);
#endif
SendMessage(
pInstInfo->hwndEdit1,
EM_REPLACESEL,
0,
(LPARAM) (char far *) ""
);
#ifdef WIN32
SendMessage(
pInstInfo->hwndEdit1,
EM_SETSEL,
(WPARAM)0xfffffffd,
(LPARAM)0xfffffffe
);
#else
SendMessage(
pInstInfo->hwndEdit1,
EM_SETSEL,
(WPARAM)1,
(LPARAM) MAKELONG (0xfffd, 0xfffe)
);
#endif
}
}
break;
case IDC_LIST1:
#ifdef WIN32
if (HIWORD(wParam) == LBN_SELCHANGE)
#else
if (HIWORD(lParam) == LBN_SELCHANGE)
#endif
{
int iSel;
RECT rect;
iSel = SendMessage (pInstInfo->hwndList1, LB_GETCURSEL, 0, 0);
ShowWindow (pInstInfo->hwndList2, SW_HIDE);
pInstInfo->hwndList2 = (HWND) SendMessage(
pInstInfo->hwndList1,
LB_GETITEMDATA,
(WPARAM) iSel,
0
);
GetClientRect (hwnd, &rect);
SendMessage(
hwnd,
WM_SIZE,
0,
MAKELONG((rect.right-rect.left),(rect.bottom-rect.top))
);
ShowWindow (pInstInfo->hwndList2, SW_SHOW);
}
break;
case IDM_START:
{
DWORD dwThreadID;
HANDLE hThread;
pInstInfo->bStopTest = FALSE;
if (!(hThread = CreateThread(
NULL,
0,
(LPTHREAD_START_ROUTINE) TestThread,
(LPVOID) pInstInfo,
16384,
&dwThreadID
)))
{
ShowStr(
pInstInfo,
"CreateThread failed, err=%d",
GetLastError()
);
}
else
{
pInstInfo->bTestInProgress = TRUE;
CloseHandle (hThread);
EnableWindow (pInstInfo->hwndList1, FALSE);
EnableWindow (pInstInfo->hwndList2, FALSE);
SetWindowText (hwnd, "Test Thread: running");
MungeMenuState (pInstInfo);
}
break;
}
case IDM_STOP:
pInstInfo->bStopTest = TRUE;
break;
case IDM_KILLTAPISRV:
WinExec("cmd.exe /c kill tapisrv.exe", SW_SHOWDEFAULT);
break;
case IDM_RUNONCE:
case IDM_RUNFOREVER:
pInstInfo->bRunForever =
(LOWORD(wParam) == IDM_RUNONCE ? FALSE : TRUE);
CheckMenuItem(
hMenuHello,
LOWORD(wParam),
MF_CHECKED | MF_BYCOMMAND
);
CheckMenuItem(
hMenuHello,
(LOWORD(wParam) == IDM_RUNONCE ? IDM_RUNFOREVER : IDM_RUNONCE),
MF_UNCHECKED | MF_BYCOMMAND
);
break;
case IDM_PARAMS:
case IDM_NOPARAMS:
case IDM_NOENTEREXIT:
case IDM_PASSONLY:
{
DWORD dwMenuItem1, dwMenuItem2, dwMenuItem3;
if( LOWORD (wParam) == IDM_PARAMS)
{
giLogLevel = TRAPP_LOGLEVEL_PARAMS;
dwMenuItem1 = IDM_NOPARAMS;
dwMenuItem2 = IDM_NOENTEREXIT;
dwMenuItem3 = IDM_PASSONLY;
}
else if(LOWORD (wParam) == IDM_NOPARAMS)
{
giLogLevel = TRAPP_LOGLEVEL_NOPARAMS;
dwMenuItem1 = IDM_PARAMS;
dwMenuItem2 = IDM_NOENTEREXIT;
dwMenuItem3 = IDM_PASSONLY;
}
else if( LOWORD (wParam) == IDM_NOENTEREXIT)
{
giLogLevel = TRAPP_LOGLEVEL_NOENTEREXIT;
dwMenuItem1 = IDM_PARAMS;
dwMenuItem2 = IDM_NOPARAMS;
dwMenuItem3 = IDM_PASSONLY;
}
if( LOWORD (wParam) == IDM_PASSONLY)
{
giLogLevel = TRAPP_LOGLEVEL_PASSONLY;
dwMenuItem1 = IDM_PARAMS;
dwMenuItem2 = IDM_NOPARAMS;
dwMenuItem3 = IDM_NOENTEREXIT;
}
CheckMenuItem(
hMenuHello,
LOWORD(wParam),
MF_CHECKED | MF_BYCOMMAND
);
CheckMenuItem(
hMenuHello,
dwMenuItem1,
MF_UNCHECKED | MF_BYCOMMAND
);
CheckMenuItem(
hMenuHello,
dwMenuItem2,
MF_UNCHECKED | MF_BYCOMMAND
);
CheckMenuItem(
hMenuHello,
dwMenuItem3,
MF_UNCHECKED | MF_BYCOMMAND
);
break;
}
case IDM_STOPONFAILURE:
pInstInfo->bStopOnFailure =
(pInstInfo->bStopOnFailure ? FALSE : TRUE);
CheckMenuItem(
hMenuHello,
IDM_STOPONFAILURE,
(pInstInfo->bStopOnFailure ? MF_CHECKED : MF_UNCHECKED) |
MF_BYCOMMAND
);
break;
case IDM_ALLTESTS:
case IDM_NOTESTS:
{
int i;
HWND hwndList;
for (i = 0; i < pInstInfo->iNumSuites; i++)
{
hwndList = (HWND) SendMessage(
pInstInfo->hwndList1,
LB_GETITEMDATA,
(WPARAM) i,
0
);
SendMessage(
hwndList,
LB_SELITEMRANGE,
(WPARAM) (LOWORD(wParam) == IDM_NOTESTS ? FALSE : TRUE),
MAKELPARAM(0, 10000)
);
}
break;
}
case IDM_LOGFILE:
{
if (pInstInfo->hLogFile)
{
fclose (pInstInfo->hLogFile);
pInstInfo->hLogFile = (FILE *) NULL;
CheckMenuItem(
hMenuHello,
IDM_LOGFILE,
MF_BYCOMMAND | MF_UNCHECKED
);
pInstInfo->bLogFile = FALSE;
}
else
{
OPENFILENAME ofn;
char szDirName[256] = ".\\";
char szFile[256] = "trapper.log\0";
char szFileTitle[256] = "";
static char *szFilter =
"Log files (*.log)\0*.log\0All files (*.*)\0*.*\0\0";
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = szFilter;
ofn.lpstrCustomFilter = (LPSTR) NULL;
ofn.nMaxCustFilter = 0L;
ofn.nFilterIndex = 1;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFileTitle = szFileTitle;
ofn.nMaxFileTitle = sizeof(szFileTitle);
ofn.lpstrInitialDir = szDirName;
ofn.lpstrTitle = (LPSTR) NULL;
ofn.Flags = OFN_HIDEREADONLY;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = "LOG";
if (!GetOpenFileName(&ofn))
{
return 0L;
}
if ((pInstInfo->hLogFile = fopen (szFile, "at")) ==
(FILE *) NULL)
{
MessageBox(
hwnd,
"Error creating log file",
"TRAPPER.EXE",
MB_OK
);
}
else
{
struct tm *newtime;
time_t aclock;
time (&aclock);
newtime = localtime (&aclock);
fprintf(
pInstInfo->hLogFile,
"\n---Log opened: %s\n",
asctime (newtime)
);
CheckMenuItem(
hMenuHello,
IDM_LOGFILE,
MF_BYCOMMAND | MF_CHECKED
);
pInstInfo->bLogFile = TRUE;
}
}
break;
}
case IDM_ALLTESTSINSUITE:
case IDM_NOTESTSINSUITE:
SendMessage(
pInstInfo->hwndList2,
LB_SELITEMRANGE,
(WPARAM) (LOWORD(wParam) == IDM_NOTESTSINSUITE ? FALSE : TRUE),
MAKELPARAM(0, 10000)
);
break;
case IDM_CONFIGSUITE:
case IDM_ABOUTSUITE:
{
int iSelSuite;
char szSuiteN[16], szLibPath[256];
HANDLE hLib;
FARPROC pfn;
iSelSuite = SendMessage (pInstInfo->hwndList1, LB_GETCURSEL, 0, 0);
wsprintf (szSuiteN, "Suite%d", iSelSuite + 1);
GetPrivateProfileString(
szSuiteN,
"Path",
"",
szLibPath,
256,
gszTrapperIni
);
if (!(hLib = LoadLibrary (szLibPath)))
{
ShowStr(
pInstInfo,
"LoadLibrary('%s') failed, err=%ld",
szLibPath,
GetLastError()
);
break;
}
pfn = GetProcAddress(
hLib,
(LOWORD(wParam) == IDM_CONFIGSUITE ?
"SuiteConfig" : "SuiteAbout")
);
(*pfn)(hwnd);
FreeLibrary (hLib);
break;
}
} // switch
return 0 ;
case WM_SIZE:
{
int width = (int) LOWORD(lParam);
int height = (int) HIWORD(lParam);
int cxFrame = (int) GetSystemMetrics (SM_CXFRAME);
int cyFrame = (int) GetSystemMetrics (SM_CYFRAME);
int cyMenu = (int) 3*GetSystemMetrics (SM_CYMENU)/2;
int listboxWidth = (width - 3*cxFrame) / 2;
int listboxHeight = (height - 4*cyFrame - cyMenu) / 3;
MoveWindow(
pInstInfo->hwndList1,
cxFrame,
cyFrame,
listboxWidth,
listboxHeight,
TRUE
);
MoveWindow(
pInstInfo->hwndList2,
listboxWidth + 2*cxFrame,
cyFrame,
listboxWidth,
listboxHeight,
TRUE
);
MoveWindow(
pInstInfo->hwndEdit1,
cxFrame,
listboxHeight + 2*cyFrame,
width - 2*cxFrame,
2*listboxHeight,
TRUE
);
MoveWindow(
pInstInfo->hwndEdit2,
cxFrame,
3*listboxHeight + 3*cyFrame,
width - 2*cxFrame,
cyMenu,
TRUE
);
break;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint (hwnd, &ps);
FillRect (ps.hdc, &ps.rcPaint, GetStockObject (LTGRAY_BRUSH));
EndPaint (hwnd, &ps);
break;
}
case WM_MDIACTIVATE:
// Set the Hello menu if gaining focus
#ifdef WIN32
if ((HWND) lParam == hwnd) // activating
{
SendMessage(
hwndClient,
WM_MDISETMENU,
(WPARAM) hMenuHello,
(LPARAM) hMenuHelloWindow
) ;
MungeMenuState (pInstInfo);
}
else
{
SendMessage(
hwndClient,
WM_MDISETMENU,
(WPARAM) hMenuInit,
(LPARAM) hMenuInitWindow
);
}
#else
if (wParam == TRUE)
{
SendMessage(
hwndClient,
WM_MDISETMENU,
0,
MAKELONG (hMenuHello, hMenuHelloWindow)
) ;
MungeMenuState (pInstInfo);
}
else
{
SendMessage(
hwndClient,
WM_MDISETMENU,
0,
MAKELONG (hMenuInit, hMenuInitWindow)
);
}
#endif
DrawMenuBar (hwndFrame);
return 0;
case WM_ADDTEXT:
{
if (lParam == TRAPPER_MSG_KEY)
{
SendMessage(
pInstInfo->hwndEdit1,
EM_SETSEL,
(WPARAM)0xfffffffd,
(LPARAM)0xfffffffe
);
WaitForSingleObject (pInstInfo->hTextBufMutex, INFINITE);
SendMessage(
pInstInfo->hwndEdit1,
EM_REPLACESEL,
0,
(LPARAM) pInstInfo->pTextBuf
);
pInstInfo->pTextBuf[0] = 0;
ReleaseMutex (pInstInfo->hTextBufMutex);
SendMessage (pInstInfo->hwndEdit1, EM_SCROLLCARET, 0, 0);
}
break;
}
case WM_TESTTHREADTERMINATED:
if (lParam == TRAPPER_MSG_KEY)
{
pInstInfo->bTestInProgress = FALSE;
EnableWindow (pInstInfo->hwndList1, TRUE);
EnableWindow (pInstInfo->hwndList2, TRUE);
SetWindowText (hwnd, "Test Thread: stopped");
if (hwnd == (HWND)SendMessage (hwndClient, WM_MDIGETACTIVE, 0, 0L))
{
MungeMenuState (pInstInfo);
}
}
break;
case WM_QUERYENDSESSION:
case WM_CLOSE:
break;
case WM_DESTROY:
LocalFree (LocalHandle (pInstInfo->pTextBuf));
CloseHandle (pInstInfo->hTextBufMutex);
LocalFree (LocalHandle (pInstInfo));
return 0;
}
return DefMDIChildProc (hwnd, msg, wParam, lParam);
}
void
TestThread(
PINSTANCE_INFO pInstInfo
)
{
static char gszStatus[] = "Total=%d, Reps=%d, Passed=%d, Failed=%d";
int i, iReps = 0, iPassed = 0, iFailed = 0, iTotal = 0;
BOOL bRunForever;
char buf[80];
memset(buf, 0, 80);
ShowStr (pInstInfo, "TestThread: enter");
TlsSetValue (gdwTlsIndex, (LPVOID) pInstInfo);
do
{
for (i = 0; i < pInstInfo->iNumSuites; i++)
{
int iSelCount, *aiSelItems, j;
HWND hwndList;
char szLibName[256], szTestN[16], szSuiteN[16];
HANDLE hLib;
FARPROC pfn;
char szScriptFileName[256];
if (pInstInfo->bStopTest)
{
goto TestThread_return;
}
hwndList = (HWND) SendMessage(
pInstInfo->hwndList1,
LB_GETITEMDATA,
(WPARAM) i,
0
);
if (!(iSelCount = SendMessage (hwndList, LB_GETSELCOUNT, 0, 0)))
{
continue;
}
aiSelItems = LocalAlloc (LPTR, iSelCount * sizeof (int));
SendMessage(
hwndList,
LB_GETSELITEMS,
(WPARAM) iSelCount,
(LPARAM) aiSelItems
);
wsprintf (szSuiteN, "Suite%d", i + 1);
GetPrivateProfileString(
szSuiteN,
"Path",
"",
szLibName,
256,
gszTrapperIni
);
if (!(hLib = LoadLibrary (szLibName)))
{
ShowStr(
pInstInfo,
"LoadLibrary('%s') failed, err=%d",
szLibName,
GetLastError()
);
continue;
}
if (!(pfn = GetProcAddress (hLib, "SuiteInit")))
{
ShowStr(
pInstInfo,
"GetProcAddress ('%s', 'SuiteInit') failed, err=%d",
szLibName,
GetLastError()
);
goto clean_up_Suite;
}
(*pfn)(LogProc);
for (j = 0; j < iSelCount; j++)
{
BOOL bResult;
if (pInstInfo->bStopTest)
{
LocalFree (LocalHandle (aiSelItems));
FreeLibrary (hLib);
goto TestThread_return;
}
wsprintf (szTestN, "Test%d", aiSelItems[j] + 1);
if (!(pfn = GetProcAddress (hLib, szTestN)))
{
ShowStr(
pInstInfo,
"GetProcAddress ('%s', 'SuiteInit') failed, err=%d",
szLibName,
GetLastError()
);
continue;
}
GetPrivateProfileString(
szSuiteN,
"szTestN",
"",
szScriptFileName,
256,
gszTrapperIni
);
// bResult = (*pfn)(hInst, szScriptFileName);
bResult = (*pfn)(hInst);
if (!bResult)
{
iFailed++;
iTotal++;
if (pInstInfo->bStopOnFailure)
{
LocalFree (LocalHandle (aiSelItems));
FreeLibrary (hLib);
goto TestThread_return;
}
}
else
{
iPassed++;
iTotal++;
}
wsprintf (buf, gszStatus, iTotal, iReps, iPassed, iFailed);
SetWindowText (pInstInfo->hwndEdit2, buf);
}
pfn = GetProcAddress (hLib, "SuiteShutdown");
(*pfn)();
clean_up_Suite:
LocalFree (LocalHandle (aiSelItems));
FreeLibrary (hLib);
}
iReps++;
} while (pInstInfo->bRunForever);
TestThread_return:
wsprintf (buf, gszStatus, iTotal, iReps, iPassed, iFailed);
SetWindowText (pInstInfo->hwndEdit2, buf);
PostMessage (pInstInfo->hwnd, WM_TESTTHREADTERMINATED, 0, TRAPPER_MSG_KEY);
ShowStr (pInstInfo, "TestThread: exit");
ShowStr (pInstInfo, buf);
ExitThread (0);
}
BOOL
CALLBACK
MemoryStatusWndProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam
)
{
switch (msg)
{
case WM_INITDIALOG:
{
static char szMemStatus[] =
"MemoryLoad = %d%%\r\n" \
"TotalPhys = x%x\r\n" \
"AvailPhys = x%x\r\n" \
"TotalPageFile = x%x\r\n" \
"AvailPageFile = x%x\r\n" \
"TotalVirtual = x%x\r\n" \
"AvailVirtual = x%x";
char buf[256];
MEMORYSTATUS memoryStatus;
wsprintf(
buf,
szMemStatus,
gInitialMemoryStatus.dwMemoryLoad,
gInitialMemoryStatus.dwTotalPhys,
gInitialMemoryStatus.dwAvailPhys,
gInitialMemoryStatus.dwTotalPageFile,
gInitialMemoryStatus.dwAvailPageFile,
gInitialMemoryStatus.dwTotalVirtual,
gInitialMemoryStatus.dwAvailVirtual
);
SetDlgItemText (hwnd, IDC_EDIT1, buf);
GlobalMemoryStatus (&memoryStatus);
wsprintf(
buf,
szMemStatus,
memoryStatus.dwMemoryLoad,
memoryStatus.dwTotalPhys,
memoryStatus.dwAvailPhys,
memoryStatus.dwTotalPageFile,
memoryStatus.dwAvailPageFile,
memoryStatus.dwTotalVirtual,
memoryStatus.dwAvailVirtual
);
SetDlgItemText (hwnd, IDC_EDIT2, buf);
break;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
EndDialog (hwnd, 0);
break;
} // switch
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint (hwnd, &ps);
FillRect (ps.hdc, &ps.rcPaint, GetStockObject (LTGRAY_BRUSH));
EndPaint (hwnd, &ps);
break;
}
} // switch
return FALSE;
}
VOID
ShowStr(
PINSTANCE_INFO pInstInfo,
char far *format,
...
)
{
int iLen;
char buf[256];
va_list ap;
va_start(ap, format);
wvsprintf (buf, format, ap);
if (pInstInfo->hLogFile)
{
fprintf(pInstInfo->hLogFile, "%s\n", buf);
}
strcat (buf, "\r\n");
iLen = (int) strlen (buf);
WaitForSingleObject (pInstInfo->hTextBufMutex, INFINITE);
if ((pInstInfo->dwTextBufUsedSize + iLen) > pInstInfo->dwTextBufTotalSize)
{
char *pBuf;
if ((pBuf = LocalAlloc (LPTR, 2 * pInstInfo->dwTextBufTotalSize)))
{
memcpy (pBuf, pInstInfo->pTextBuf, pInstInfo->dwTextBufUsedSize);
LocalFree (LocalHandle (pInstInfo->pTextBuf));
pInstInfo->pTextBuf = pBuf;
pInstInfo->dwTextBufTotalSize *= 2;
if (pInstInfo->pTextBuf[0] == 0)
{
//
// The handler for WM_ADDTEXT zeroes out the first byte in the
// buffer when it has added the text to the edit control,so if
// here we know we need to post another msg to alert that more
// text needs to be added
//
PostMessage(
pInstInfo->hwnd,
WM_ADDTEXT,
0,
TRAPPER_MSG_KEY
);
pInstInfo->dwTextBufUsedSize = 1;
}
strcat (pInstInfo->pTextBuf, buf);
pInstInfo->dwTextBufUsedSize += iLen;
}
else
{
if (pInstInfo->pTextBuf[0] == 0)
{
//
// The handler for WM_ADDTEXT zeroes out the first byte in the
// buffer when it has added the text to the edit control,so if
// here we know we need to post another msg to alert that more
// text needs to be added
//
PostMessage(
pInstInfo->hwnd,
WM_ADDTEXT,
0,
TRAPPER_MSG_KEY
);
pInstInfo->dwTextBufUsedSize = 1;
}
}
}
else
{
if (pInstInfo->pTextBuf[0] == 0)
{
//
// The handler for WM_ADDTEXT zeroes out the first byte in the
// buffer when it has added the text to the edit control, so if
// here we know we need to post another msg to alert that more
// text needs to be added
//
PostMessage(
pInstInfo->hwnd,
WM_ADDTEXT,
0,
TRAPPER_MSG_KEY
);
pInstInfo->dwTextBufUsedSize = 1;
}
strcat (pInstInfo->pTextBuf, buf);
pInstInfo->dwTextBufUsedSize += iLen;
}
ReleaseMutex (pInstInfo->hTextBufMutex);
va_end(ap);
}
void
__export
LogProc(
int level,
char *format,
...
)
{
if (level <= giLogLevel)
{
int iLen;
char buf[256] = " ";
va_list ap;
va_start(ap, format);
wvsprintf (buf + 4, format, ap);
ShowStr ((PINSTANCE_INFO) TlsGetValue (gdwTlsIndex), buf);
va_end(ap);
}
}
/*
void
__export
SetLogLevel(
int level
)
{
giLogLevel = level;
}
int
__export
GetLogLevel(
)
{
return giLogLevel;
}
*/