/* t4main.c (c)Copyright Sequiter Software Inc., 1990-1993. All rights reserved. */ /* Main test program for running CodeBase test code */ #ifdef S4OS2PM #define INCL_WINSYS #define INCL_WINWINDOWMGR #define INCL_DOSPROCESS #define INCL_GPIPRIMITIVES #define INCL_GPILCIDS #endif #include "d4all.h" #ifdef __TURBOC__ #pragma hdrstop #endif #include "t4test.h" #ifdef __ZTC__ #ifdef S4WINDOWS #ifndef NULL #define NULL 0 #endif #endif #endif #ifdef __TURBOC__ extern unsigned _stklen = 28000; #endif D4DISPLAY display ; #ifndef S4WINDOWS #ifndef S4OS2PM main( int argc, char **argv ) { d4parsestring_init( &display.parse_str, argc, argv ) ; return t4test( &display ) ; } #else #include HWND hwndMainFrame = NULLHANDLE ; HWND hwndMain ; HDC hdcMain ; HAB hab ; HMQ hmq ; CHAR szAppName[MAXNAMEL] ; CHAR szUntitled[MESSAGELEN] ; VOID ExitProc(USHORT usTermCode) { if(WinIsWindow(hab, hwndMainFrame)) WinDestroyWindow(hwndMainFrame) ; WinDestroyMsgQueue(hmq) ; WinTerminate(hab) ; DosExitList(EXLST_EXIT, (PFNEXITLIST)NULL) ; } int on_val = 0 ; int thread_on = 0 ; VOID t4thread( void *disp ) { D4DISPLAY *display ; int i ; thread_on = 1 ; display = (D4DISPLAY *)disp ; /* Clear the window after marking that thread has started, but before test input started */ WinInvalidateRegion( display->hWnd, (HRGN)NULL, FALSE ); on_val = 1 ; t4test( display ) ; while ( display->display_set == 1 ) /* a display message not processed is waiting */ ; display->display_set = 1 ; /* mark a message as pending */ display->do_box = 1 ; strcpy( display->str, "Test Thread Completed" ) ; display->len = strlen( display->str ) ; display->display_set = 1 ; WinInvalidateRegion( display->hWnd, (HRGN)NULL, FALSE ); DosSleep( 1000L ) ; /* delay to ensure on_val still true when box comes out */ on_val = 0 ; thread_on = 0 ; _endthread() ; } VOID MainCommand(HWND hwnd, MPARAM mp1, MPARAM mp2) { switch(SHORT1FROMMP(mp1)) { case IDM_ABOUT: WinMessageBox(HWND_DESKTOP, hwnd, "CodeBase 5.0 Test Routines - version 1.0", "CB 5.0 OS/2", MSGBOXID, MB_OK ) ; break ; case EM_CODEBASE_ERROR: WinMessageBox(HWND_DESKTOP, display.hWnd, display.str, "CB 5.0 OS/2 ERROR", MSGBOXID, MB_OK ) ; display.display_set = 0 ; break ; case IDM_DO_TEST: if ( thread_on == 1 ) /* test already executing... */ { WinMessageBox(HWND_DESKTOP, hwnd, "Test thread already started...", "CB 5.0 OS/2 TEST", MSGBOXID, MB_OK ) ; return; } if ( _beginthread( t4thread, 20480, (void *)&display ) == -1 ) { WinMessageBox(HWND_DESKTOP, hwnd, "CodeBase 5.0 Test Failure- Couldn't start thread", "CB 5.0 OS/2", MSGBOXID, MB_OK ) ; return; } break ; } return; } MRESULT EXPENTRY MainWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) { RECTL rclUpdate ; HPS hps ; RECTL rect ; POINTL pt ; SIZEL size ; int i, height, width ; char blank_line[180] ; switch(msg) { case WM_CREATE: d4display_init( &display, hwnd ) ; break ; case WM_PAINT: if ( display.display_set == 0 ) /* not a CodeBase message, must be a general system message... */ { hps = WinBeginPaint(hwnd, NULLHANDLE, &rclUpdate) ; WinFillRect(hps, &rclUpdate, SYSCLR_WINDOW) ; WinEndPaint(hps) ; } else { if ( display.do_box == 1 ) /* message box instead of regular output */ { display.do_box = 0 ; WinMessageBox(HWND_DESKTOP, display.hWnd, display.str, "CB 5.0 OS/2 TEST", MSGBOXID, MB_OK ) ; } else { hps = WinBeginPaint( hwnd, (HPS)NULL, &rect ); GpiSetColor( hps, CLR_NEUTRAL ); /* set text color */ GpiSetBackColor( hps, CLR_BACKGROUND ); /* set text background */ GpiSetBackMix( hps, BM_OVERPAINT ); /* set text mix */ WinQueryWindowRect(hwnd,&rect); /* get window bounds */ memset(blank_line, 32, 179) ; blank_line[179] = '\0' ; GpiQueryDefCharBox( hps, &size ) ; height = size.cy + 1 ; width = size.cx ; if ( display.is_new_line ) { display.x = 0 ; display.y += height + display.tm.lExternalLeading ; } if ( (display.y+height) > rect.yTop ) { display.y = 0 ; WinInvalidateRect( display.hWnd, &rect, 1 ) ; } pt.x = display.x ; pt.y = rect.yTop - display.y ; GpiCharStringAt( hps, &pt, display.len, display.str ) ; if ( (display.y+(2*height)) > rect.yTop ) { pt.x = 0 ; pt.y = rect.yTop ; GpiCharStringAt( hps, &pt, strlen( blank_line ), blank_line ) ; } else { pt.x = 0 ; pt.y = rect.yTop - ( display.y + height + display.tm.lExternalLeading ) ; GpiCharStringAt( hps, &pt, strlen( blank_line ), blank_line ) ; } WinEndPaint( hps ); display.x += width ; } display.display_set = 0 ; } break ; case WM_COMMAND: MainCommand(hwnd, mp1, mp2); break ; default: return(WinDefWindowProc(hwnd, msg, mp1, mp2)) ; } return (MRESULT)0 ; } BOOL Init(VOID) { if(DosExitList(EXLST_ADD, (PFNEXITLIST)ExitProc)) DosExit(EXIT_PROCESS, 1) ; if(0 == WinLoadString(hab, (HMODULE)0, IDS_APPNAME, MAXNAMEL, szAppName)) return 0 ; if(!WinLoadString(hab, (HMODULE)0, IDS_UNTITLED, MESSAGELEN, szUntitled)) return 0 ; if(!WinRegisterClass( hab, (PSZ)szAppName, (PFNWP)MainWndProc, CS_SIZEREDRAW, 0L)) return 0 ; return 1 ; } main( int argc, char **argv ) { QMSG qmsg ; ULONG flCtlData ; CODE4 cb ; d4init( &cb ) ; hab = WinInitialize(0) ; if ( hab == NULLHANDLE ) return 1 ; hmq = WinCreateMsgQueue(hab, 0) ; if ( hmq == NULLHANDLE ) { WinTerminate(hab) ; return 1 ; } if(!Init()) return 1 ; flCtlData = FCF_STANDARD & ~FCF_SHELLPOSITION ; hwndMainFrame = WinCreateStdWindow( HWND_DESKTOP, 0, &flCtlData, (PSZ)szAppName, "", 0, (HMODULE)NULL, IDR_MAIN, (PHWND)&hwndMain) ; if ( hwndMainFrame == NULLHANDLE ) return 1 ; WinSetWindowText(hwndMainFrame, "CodeBase 5.0 Test"); if (!WinSetWindowPos( hwndMainFrame, HWND_TOP, 20, 100, 600, 300, SWP_SIZE | SWP_MOVE | SWP_ACTIVATE | SWP_SHOW )) d4parsestring_init( &display.parse_str, argc, argv ) ; while(WinGetMsg(hmq, (PQMSG)&qmsg, (HWND)NULL, (ULONG)NULL, (ULONG)NULL)) WinDispatchMsg(hmq, (PQMSG)&qmsg) ; return 0 ; } #endif #else int PASCAL WinMain(HANDLE, HANDLE, LPSTR, int); BOOL InitApplication(HANDLE); BOOL InitInstance(HANDLE, int); LRESULT CALLBACK MainWndProc(HWND, UINT, UINT, LONG); int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { if (!hPrevInstance) if (!InitApplication(hInstance)) return (FALSE); if (!InitInstance(hInstance, nCmdShow)) return (FALSE); d4parsestring_init( &display.parse_str, lpCmdLine ) ; t4test( &display ) ; PostQuitMessage(0) ; for (;;) { if (d4display_quit( &display ) ) return (display.msg.wParam) ; } } BOOL InitApplication(HANDLE hInstance) { WNDCLASS wc; wc.style = (UINT) NULL; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon( (HINSTANCE) NULL, IDI_APPLICATION); wc.hCursor = LoadCursor( (HINSTANCE) NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = "TestMenu"; wc.lpszClassName = "TestWClass"; return (RegisterClass(&wc)); } BOOL InitInstance( HANDLE hInstance, int nCmdShow) { HWND hWnd; hWnd = CreateWindow( "TestWClass", "Test CodeBase", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL, (HMENU) NULL, hInstance, NULL ); if ( !hWnd ) return (FALSE); SetTimer( hWnd, (UINT) hWnd, 1000, (TIMERPROC) NULL ) ; d4display_init( &display, hWnd ) ; display.hInst = hInstance ; /* for t4filter.c */ ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return (TRUE); } LRESULT CALLBACK MainWndProc( HWND hWnd, UINT message, UINT wParam, LONG lParam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); break; case WM_CLOSE: display.did_close = 1 ; return (DefWindowProc(hWnd, message, wParam, lParam)); default: return (DefWindowProc(hWnd, message, wParam, lParam)); } return (LONG) NULL ; } #endif