/*++ Copyright (c) 1993 Microsoft Corporation Module Name: ui.c Abstract: This function implements the ui (dialog) for getdbg. Author: Wesley Witt (wesw) 1-May-1993 Environment: User Mode --*/ #include #include #include #include #include #include #include #include "resource.h" #include "getdbg.h" extern DWORD FilesType; extern BOOL ImmediateCopy; extern BOOL HelpRequest; extern CHAR PreferredServer[]; extern CHAR PreferredShare[]; extern CHAR DestinationDir[]; CHAR HelpText[] = "GETDBG [options] [destination path]\n\n" "-? Gives this messagebox\n" "-k Copy KD binaries\n" "-w Copy WINDBG binaries\n" "-g Start copy immediatly\n" "-t Disable network timeouts (use this if the newtwork is slow)\n" "-s Specify preferred server and/or share\n"; VOID CancelConnection(VOID); LPCOPYINFO CopyFiles(DWORD,LPSTR,HWND); LRESULT GetDbgWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); BOOL SubclassControls( HWND hwnd ); VOID SetFocusToCurrentControl( VOID ); VOID AddServersToListBox( LPSTR, LPSTR, DWORD, HWND ); VOID DrawMeterBar( HWND, DWORD, DWORD, DWORD, BOOL); VOID UpdateFilesListbox(DWORD,HWND); void GetDbgWinMain( void ) /*++ Routine Description: This is the entry point for getdbg Arguments: None. Return Value: None. --*/ { HWND hwnd; MSG msg; WNDCLASS wndclass; HINSTANCE hInst; hInst = GetModuleHandle( NULL ); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = GetDbgWndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = DLGWINDOWEXTRA; wndclass.hInstance = hInst; wndclass.hIcon = LoadIcon( hInst, MAKEINTRESOURCE(APPICON) ); wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); wndclass.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "GetDbgDialog"; RegisterClass( &wndclass ); hwnd = CreateDialog( hInst, MAKEINTRESOURCE( GETDBGDIALOG ), 0, GetDbgWndProc ); ShowWindow( hwnd, SW_SHOWNORMAL ); while (GetMessage (&msg, NULL, 0, 0)) { if (!IsDialogMessage( hwnd, &msg )) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } } return; } VOID DisableControls( HWND hDlg ) { EnableWindow( GetDlgItem( hDlg, ID_SERVERS ), FALSE ); EnableWindow( GetDlgItem( hDlg, ID_SHARES ), FALSE ); EnableWindow( GetDlgItem( hDlg, ID_FILES ), FALSE ); EnableWindow( GetDlgItem( hDlg, ID_KD_DBG ), FALSE ); EnableWindow( GetDlgItem( hDlg, ID_WINDBG_DBG ), FALSE ); EnableWindow( GetDlgItem( hDlg, IDOK ), FALSE ); EnableWindow( GetDlgItem( hDlg, ID_DEST_PATH ), FALSE ); } VOID EnableControls( HWND hDlg ) { EnableWindow( GetDlgItem( hDlg, ID_SERVERS ), TRUE ); EnableWindow( GetDlgItem( hDlg, ID_SHARES ), TRUE ); EnableWindow( GetDlgItem( hDlg, ID_FILES ), TRUE ); EnableWindow( GetDlgItem( hDlg, ID_KD_DBG ), TRUE ); EnableWindow( GetDlgItem( hDlg, ID_WINDBG_DBG ), TRUE ); EnableWindow( GetDlgItem( hDlg, IDOK ), TRUE ); EnableWindow( GetDlgItem( hDlg, ID_DEST_PATH ), TRUE ); } LRESULT GetDbgWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) /*++ Routine Description: Window procedure for the DRWTSN32.EXE main user interface. Arguments: hwnd - window handle to the dialog box message - message number wParam - first message parameter lParam - second message parameter Return Value: TRUE - did not process the message FALSE - did process the message --*/ { static BOOL first = TRUE; static BOOL fPaint = FALSE; static METERINFO mi = {0,0,100,0,100}; static LPCOPYINFO lpci = NULL; DWORD i; CHAR server[64]; CHAR share[64]; LPADDSERVERS lpas; LPMETERINFO lpmi; LPSTR lpServer = NULL; LPSTR lpShare = NULL; switch (message) { case WM_CREATE: if (HelpRequest) { MessageBox( NULL, HelpText, "Debugger Copy Help", MB_OK | MB_ICONINFORMATION ); ExitProcess( 0 ); } return 0; case WM_INITDIALOG: SubclassControls( hwnd ); if (FilesType == WINDBG_FILES) { CheckRadioButton( hwnd, ID_WINDBG_DBG, ID_KD_DBG, ID_WINDBG_DBG ); } else if (FilesType == KD_FILES) { CheckRadioButton( hwnd, ID_WINDBG_DBG, ID_KD_DBG, ID_KD_DBG ); } SendMessage( GetDlgItem( hwnd, ID_DEST_PATH ), WM_SETTEXT, 0, (LPARAM)DestinationDir ); return 1; case WU_DRAWMETER: lpmi = (LPMETERINFO) lParam; mi.m1Completed = lpmi->m1Completed; mi.m1Count = lpmi->m1Count; mi.m2Completed = lpmi->m2Completed; mi.m2Count = lpmi->m2Count; DrawMeterBar( hwnd, ID_METER_ALLFILES, mi.m1Completed, mi.m1Count, wParam ); DrawMeterBar( hwnd, ID_METER_ONEFILE, mi.m2Completed, mi.m2Count, wParam ); return 0; case WU_ADDSERVERS: if (*PreferredServer) { lpServer = PreferredServer; } if (*PreferredShare) { lpShare = PreferredShare; } DisableControls( hwnd ); AddServersToListBox( lpServer, lpShare, FilesType, hwnd ); return 0; case WU_COPY_DONE: EnableControls( hwnd ); if (ImmediateCopy) { SendMessage( hwnd, WM_CLOSE, 0, 0 ); } EnableWindow( GetDlgItem( hwnd, ID_STOP ), FALSE ); free( lpci ); lpci = NULL; return 0; case WU_AS_DONE: lpas = (LPADDSERVERS) lParam; // Shut off all threads if (lpas->hThreadWait) { TerminateThread (lpas->hThreadWait, 0); } TerminateThread (lpas->hThread, 0); if (lpas->rc == 0) { DestroyWindow( lpas->hwndWait ); if (ImmediateCopy) { DisableControls( hwnd ); lpci = CopyFiles( FilesType, DestinationDir, hwnd ); } else { EnableControls( hwnd ); } } else { MessageBox( hwnd, "Could not establish a connection", "Debugger Copy", MB_OK | MB_ICONINFORMATION ); DestroyWindow( lpas->hwndWait ); if (ImmediateCopy) { SendMessage( hwnd, WM_CLOSE, 0, 0 ); return 0; } if (*PreferredServer) { lpServer = PreferredServer; } if (*PreferredShare) { lpShare = PreferredShare; } AddServersToListBox( lpServer, lpShare, FilesType, hwnd ); } SetFocus( GetDlgItem( hwnd, ID_SERVERS ) ); free( lpas ); return 0; case WM_ACTIVATEAPP: case WM_SETFOCUS: fPaint = TRUE; if (first) { first = FALSE; PostMessage( hwnd, WU_ADDSERVERS, 0, 0 ); } SetFocusToCurrentControl(); return 0; case WM_COMMAND: switch (wParam) { case IDCANCEL: SendMessage( hwnd, WM_CLOSE, 0, 0 ); break; case IDOK: DisableControls( hwnd ); EnableWindow( GetDlgItem( hwnd, ID_STOP ), TRUE ); SendMessage( GetDlgItem( hwnd, ID_DEST_PATH ), WM_GETTEXT, MAX_PATH, (LPARAM)DestinationDir ); lpci = CopyFiles( FilesType, DestinationDir, hwnd ); break; case ID_STOP: if (lpci) { SetEvent( lpci->hStopEvent ); } else { MessageBeep( 0 ); } break; default: if (LOWORD(wParam) == ID_SERVERS && HIWORD(wParam) == LBN_SELCHANGE) { i = SendDlgItemMessage( hwnd, ID_SERVERS, LB_GETCURSEL, 0, 0 ); SendDlgItemMessage( hwnd, ID_SERVERS, LB_GETTEXT, i, (LPARAM)server ); DisableControls( hwnd ); AddServersToListBox( server, NULL, FilesType, hwnd ); } if (LOWORD(wParam) == ID_SHARES && HIWORD(wParam) == LBN_SELCHANGE) { i = SendDlgItemMessage( hwnd, ID_SERVERS, LB_GETCURSEL, 0, 0 ); SendDlgItemMessage( hwnd, ID_SERVERS, LB_GETTEXT, i, (LPARAM)server ); i = SendDlgItemMessage( hwnd, ID_SHARES, LB_GETCURSEL, 0, 0 ); SendDlgItemMessage( hwnd, ID_SHARES, LB_GETTEXT, i, (LPARAM)share ); DisableControls( hwnd ); AddServersToListBox( server, share, FilesType, hwnd ); } if (HIWORD(wParam) == BN_CLICKED) { if (IsDlgButtonChecked( hwnd, ID_KD_DBG ) ) { FilesType = KD_FILES; UpdateFilesListbox( FilesType, hwnd ); } else if (IsDlgButtonChecked( hwnd, ID_WINDBG_DBG ) ) { FilesType = WINDBG_FILES; UpdateFilesListbox( FilesType, hwnd ); } } } break; case WM_PAINT: if (fPaint) { fPaint = FALSE; SendMessage( hwnd, WU_DRAWMETER, TRUE, (LPARAM)&mi ); } break; case WM_CLOSE: CancelConnection(); break; case WM_DESTROY: PostQuitMessage( 0 ); return 0; } return DefWindowProc( hwnd, message, wParam, lParam ); } VOID DrawMeterBar( HWND hwnd, DWORD ctlId, DWORD wPartsComplete, DWORD wPartsInJob, BOOL fRedraw ) { RECT rcPrcnt; DWORD dwColor; SIZE size; DWORD pct; CHAR szPercentage[255]; HPEN hpen; HPEN oldhpen; HDC hDC; RECT rcItem; POINT pt; wPartsComplete == 0; hDC = GetDC( hwnd ); GetWindowRect( GetDlgItem(hwnd,ctlId), &rcItem ); pt.x = rcItem.left; pt.y = rcItem.top; ScreenToClient( hwnd, &pt ); rcItem.left = pt.x; rcItem.top = pt.y; pt.x = rcItem.right; pt.y = rcItem.bottom; ScreenToClient( hwnd, &pt ); rcItem.right = pt.x; rcItem.bottom = pt.y; hpen = CreatePen( PS_SOLID, 1, RGB(0,0,0) ); oldhpen = SelectObject( hDC, hpen ); if (fRedraw) { Rectangle( hDC, rcItem.left, rcItem.top, rcItem.right, rcItem.bottom ); } SelectObject( hDC, oldhpen ); DeleteObject( hpen ); rcItem.left += 2; rcItem.top += 2; rcItem.right -= 2; rcItem.bottom -= 2; // // Set-up default foreground and background text colors. // SetBkColor( hDC, RGB(125,125,125) ); SetTextColor( hDC, RGB(125,58,125) ); SetTextAlign(hDC, TA_CENTER | TA_TOP); // // Invert the foreground and background colors. // dwColor = GetBkColor(hDC); SetBkColor(hDC, SetTextColor(hDC, dwColor)); // // calculate the percentage done // try { pct = (DWORD)((float)wPartsComplete / (float)wPartsInJob * 100.0); } except(EXCEPTION_EXECUTE_HANDLER) { pct = 0; } // // Set rectangle coordinates to include only left part of the window // rcPrcnt.top = rcItem.top; rcPrcnt.bottom = rcItem.bottom; rcPrcnt.left = rcItem.left; rcPrcnt.right = rcItem.left + (DWORD)((float)(rcItem.right - rcItem.left) * ((float)pct / 100)); // // Output the percentage value in the window. // Function also paints left part of window. // wsprintf(szPercentage, "%d%%", pct); GetTextExtentPoint(hDC, "X", 1, &size); ExtTextOut( hDC, (rcItem.right - rcItem.left) / 2, rcItem.top + ((rcItem.bottom - rcItem.top - size.cy) / 2), ETO_OPAQUE | ETO_CLIPPED, &rcPrcnt, szPercentage, strlen(szPercentage), NULL ); // // Adjust rectangle so that it includes the remaining // percentage of the window. // rcPrcnt.left = rcPrcnt.right; rcPrcnt.right = rcItem.right; // // Invert the foreground and background colors. // dwColor = GetBkColor(hDC); SetBkColor(hDC, SetTextColor(hDC, dwColor)); // // Output the percentage value a second time in the window. // Function also paints right part of window. // ExtTextOut( hDC, (rcItem.right - rcItem.left) / 2, rcItem.top + ((rcItem.bottom - rcItem.top - size.cy) / 2), ETO_OPAQUE | ETO_CLIPPED, &rcPrcnt, szPercentage, strlen(szPercentage), NULL ); ReleaseDC( hwnd, hDC ); return; }