|
|
1.1 ! root 1: //==========================================================================// ! 2: // Includes // ! 3: //==========================================================================// ! 4: #include <string.h> // strupr ! 5: #include <stdio.h> // for sprintf. ! 6: #include <locale.h> // TESTING TESTING ! 7: ! 8: ! 9: #include "perfmon.h" ! 10: #include "init.h" // external declarations for this file ! 11: ! 12: #include "alert.h" // for AlertIitializeApplication ! 13: #include "command.h" // for ViewChart ! 14: #include "grafdata.h" // for QuerySaveChart ! 15: #include "graph.h" // for GraphInitializeApplication ! 16: #include "legend.h" // for LegendInitializeApplication ! 17: #include "log.h" // for LogInitializeApplication ! 18: #include "intrline.h" // for ILineInitializeApplication ! 19: #include "perfdata.h" // for PerfDataInitializeInstance ! 20: #include "perfmops.h" // for OpenFileHandler, for now ! 21: #include "status.h" // for StatusInitializeApplication ! 22: #include "timeline.h" // for TLineInitializeApplication ! 23: #include "playback.h" // for PlaybackInitializeInstance ! 24: #include "registry.h" // for Load/SaveMainWindowPlacement ! 25: #include "report.h" // for ReportInitializeApplication ! 26: #include "toolbar.h" // for ToolbarInitializeApplication ! 27: #include "utils.h" ! 28: #include "fileopen.h" // for FileOpen ! 29: #include "pmemory.h" // for MemoryFree ! 30: ! 31: extern TCHAR DefaultLangId[] ; ! 32: extern TCHAR EnglishLangId[] ; ! 33: ! 34: //==========================================================================// ! 35: // Constants // ! 36: //==========================================================================// ! 37: ! 38: ! 39: #define szPerfmonMainClass TEXT("PerfmonMainClass") ! 40: ! 41: HHOOK lpMsgFilterProc ; ! 42: DWORD FAR PASCAL MessageFilterProc (int nCode, WPARAM wParam, ! 43: LPARAM lParam) ; ! 44: ! 45: ! 46: //==========================================================================// ! 47: // Local Functions // ! 48: //==========================================================================// ! 49: ! 50: ! 51: void GetScalesFonts (void) ! 52: { ! 53: LOGFONT lf ; ! 54: ! 55: memset (&lf, 0, sizeof (lf)) ; ! 56: ! 57: lstrcpy (lf.lfFaceName, szScalesFontFace) ; ! 58: lf.lfHeight = iScalesFontHeight ; ! 59: lf.lfWeight = FW_REGULAR ; ! 60: ! 61: hFontScales = CreateFontIndirect (&lf) ; ! 62: ! 63: lf.lfWeight = FW_BOLD ; ! 64: hFontScalesBold = CreateFontIndirect (&lf) ; ! 65: } ! 66: ! 67: ! 68: BOOL InitializeSystemValues (void) ! 69: /* ! 70: Effect: Read and store in variables the various system values, ! 71: such as the width and height of the screen and icons, ! 72: the width of scroll bars, etc. ! 73: ! 74: Called By: PerfmonInitialize only. ! 75: ! 76: Returns: Whether this function was successful in getting all ! 77: needed system values. ! 78: */ ! 79: { // InitializeSystemValues ! 80: xScreenWidth = GetSystemMetrics (SM_CXSCREEN) ; ! 81: yScreenHeight = GetSystemMetrics (SM_CYSCREEN) ; ! 82: ! 83: xBorderWidth = GetSystemMetrics (SM_CXBORDER) ; ! 84: yBorderHeight = GetSystemMetrics (SM_CYBORDER) ; ! 85: ! 86: xScrollWidth = GetSystemMetrics (SM_CXVSCROLL) ; ! 87: yScrollHeight = GetSystemMetrics (SM_CYHSCROLL) ; ! 88: ! 89: xScrollThumbWidth = GetSystemMetrics (SM_CXHTHUMB) ; ! 90: yScrollThumbHeight = GetSystemMetrics (SM_CYVTHUMB) ; ! 91: ! 92: xDlgBorderWidth = GetSystemMetrics (SM_CXDLGFRAME) ; ! 93: yDlgBorderHeight = GetSystemMetrics (SM_CYDLGFRAME) ; ! 94: ! 95: MinimumSize = yScrollHeight + ! 96: GetSystemMetrics (SM_CYMENU) + ! 97: GetSystemMetrics (SM_CYCAPTION) ; ! 98: ! 99: //================================================================// ! 100: // create all the brushes and pens for performance improvement // ! 101: //================================================================// ! 102: CreatePerfmonSystemObjects () ; ! 103: hWhitePen = CreatePen (PS_SOLID, 3, crWhite) ; ! 104: ! 105: ! 106: // TESTING TESTING TESTING ! 107: #if 0 ! 108: { ! 109: DWORD GDIBatchLimit = GdiSetBatchLimit (1) ; ! 110: } ! 111: //mike1(TEXT("SetLocale returns %s"), setlocale(LC_NUMERIC, NULL)); ! 112: mike1(TEXT("SetLocale returns %s"), setlocale(LC_NUMERIC, NULL)); ! 113: #endif ! 114: ! 115: ! 116: return (TRUE) ; ! 117: } // InitializeSystemValues ! 118: ! 119: ! 120: BOOL InitializeApplication (void) ! 121: /* ! 122: Effect: Perform all initializations required for the FIRST ! 123: instance of the Perfmon application. In particular, ! 124: register all of Perfmon's window classes. ! 125: ! 126: Note: There is no background brush set for the MainWindow ! 127: class so that the main window is never erased. The ! 128: client area of MainWindow is always covered by one ! 129: of the view windows. If we erase it, it would just ! 130: flicker needlessly. ! 131: ! 132: Called By: PerfmonInitialize only. ! 133: ! 134: Returns: Whether this function was successful in initializing. ! 135: */ ! 136: { // InitializeApplication ! 137: BOOL bSuccess ; ! 138: WNDCLASS wc ; ! 139: TCHAR LocalHelpFileName [ShortTextLen] ; ! 140: LPTSTR pFileName ; ! 141: ! 142: hIcon = LoadIcon (hInstance, idIcon) ; ! 143: ! 144: //=============================// ! 145: // Register Main window class // ! 146: //=============================// ! 147: ! 148: wc.style = CS_DBLCLKS | CS_BYTEALIGNCLIENT; ! 149: wc.lpfnWndProc = (WNDPROC) MainWndProc; ! 150: wc.hInstance = hInstance; ! 151: wc.cbClsExtra = 0 ; ! 152: wc.cbWndExtra = 0; ! 153: wc.hIcon = hIcon ; ! 154: wc.hCursor = LoadCursor(NULL, IDI_APPLICATION); ! 155: wc.hbrBackground = NULL ; // see note above ! 156: wc.lpszMenuName = idMenuChart ; ! 157: wc.lpszClassName = szPerfmonMainClass ; ! 158: ! 159: bSuccess = RegisterClass (&wc) ; ! 160: ! 161: //=============================// ! 162: // Register Abstract "Systems" // ! 163: //=============================// ! 164: hbLightGray = GetStockObject (LTGRAY_BRUSH) ; ! 165: ! 166: if (bSuccess) ! 167: bSuccess = StatusInitializeApplication () ; ! 168: ! 169: if (bSuccess) ! 170: bSuccess = GraphInitializeApplication () ; ! 171: ! 172: #ifdef ADVANCED_PERFMON ! 173: if (bSuccess) ! 174: bSuccess = LogInitializeApplication () ; ! 175: ! 176: if (bSuccess) ! 177: bSuccess = AlertInitializeApplication () ; ! 178: ! 179: if (bSuccess) ! 180: bSuccess = ReportInitializeApplication () ; ! 181: ! 182: if (bSuccess) ! 183: bSuccess = ILineInitializeApplication () ; ! 184: ! 185: if (bSuccess) ! 186: bSuccess = TLineInitializeApplication () ; ! 187: #endif ! 188: ! 189: // setup messagehook to handle F1 as help ! 190: lpMsgFilterProc = SetWindowsHookEx (WH_MSGFILTER, ! 191: (HOOKPROC) MessageFilterProc, ! 192: hInstance, ! 193: GetCurrentThreadId()) ; ! 194: ! 195: // get the help file full path name ! 196: LoadString (hInstance, IDS_HELPFILE_NAME, ! 197: (LPTSTR)LocalHelpFileName, ShortTextLen-1); ! 198: ! 199: ! 200: if (LocalHelpFileName[0]) ! 201: { ! 202: pszHelpFile = (LPTSTR) MemoryAllocate (FilePathLen * sizeof (TCHAR)) ; ! 203: SearchPath (NULL, LocalHelpFileName, NULL, ! 204: FilePathLen - 1, pszHelpFile, &pFileName) ; ! 205: } ! 206: else ! 207: { ! 208: // no help file ! 209: pszHelpFile = (LPTSTR) MemoryAllocate (sizeof (TCHAR)) ; ! 210: *pszHelpFile = TEXT('\0') ; ! 211: } ! 212: ! 213: return (bSuccess) ; ! 214: } // InitializeApplication ! 215: ! 216: ! 217: ! 218: BOOL InitializeInstance (int nCmdShow, LPCSTR lpszCmdLine) ! 219: /* ! 220: Effect: Perform all initializations required for EACH instance ! 221: of the Perfmon application. In particular, create all ! 222: of Perfmon's initial windows, and perform any other ! 223: initializations except registering classes (done in ! 224: InitializeApplication). ! 225: ! 226: Called By: PerfmonInitialize only. ! 227: ! 228: Note: This function has multiple return points. ! 229: ! 230: Returns: Whether this function was successful in initalizing. ! 231: */ ! 232: { // InitializeInstance ! 233: DWORD ComputerNameLength; ! 234: TCHAR szApplication [WindowCaptionLen] ; ! 235: ! 236: ! 237: //=============================// ! 238: // Set Priority high // ! 239: //=============================// ! 240: ! 241: SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS) ; ! 242: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST) ; ! 243: ! 244: //=============================// ! 245: // Load Resources // ! 246: //=============================// ! 247: ! 248: GetScalesFonts () ; ! 249: ! 250: hMenuChart = LoadMenu (hInstance, idMenuChart) ; ! 251: ! 252: #ifdef ADVANCED_PERFMON ! 253: hMenuAlert = LoadMenu (hInstance, idMenuAlert) ; ! 254: hMenuLog = LoadMenu (hInstance, idMenuLog) ; ! 255: hMenuReport = LoadMenu (hInstance, idMenuReport) ; ! 256: #endif ! 257: ! 258: hAccelerators = LoadAccelerators (hInstance, idAccelerators) ; ! 259: ! 260: ! 261: //=============================// ! 262: // Initialize Systems // ! 263: //=============================// ! 264: ! 265: iLanguage = GetUserDefaultLangID() ; ! 266: iEnglishLanguage = MAKELANGID (LANG_ENGLISH, LANG_NEUTRAL) ; ! 267: // iEnglishLanguage = MAKELANGID (iLanguage & 0x0ff, LANG_NEUTRAL) ; ! 268: TSPRINTF (DefaultLangId, TEXT("%03x"), iLanguage) ; ! 269: TSPRINTF (EnglishLangId, TEXT("%03x"), iEnglishLanguage) ; ! 270: ! 271: // GetComputerName returns the name without the "\\" prefix. We add ! 272: // the prefix before even calling the routine. This is so that all our ! 273: // computer names have the prefix and are therefore compatible with ! 274: // I_SetSystemFocus (see perfmops.c). ! 275: ! 276: ComputerNameLength = MAX_COMPUTERNAME_LENGTH + 1; ! 277: lstrcpy (LocalComputerName, szComputerPrefix) ; ! 278: GetComputerName (LocalComputerName + lstrlen (szComputerPrefix), ! 279: &ComputerNameLength); ! 280: ! 281: PlaybackInitializeInstance () ; ! 282: PerfDataInitializeInstance () ; ! 283: ! 284: //=============================// ! 285: // Create Window // ! 286: //=============================// ! 287: ! 288: StringLoad (IDS_APPNAME, szApplication) ; ! 289: hWndMain = CreateWindow (szPerfmonMainClass, ! 290: szApplication, ! 291: WS_OVERLAPPEDWINDOW | WS_BORDER, ! 292: CW_USEDEFAULT, CW_USEDEFAULT, ! 293: CW_USEDEFAULT, CW_USEDEFAULT, ! 294: NULL, ! 295: NULL, ! 296: NULL, ! 297: NULL); ! 298: ! 299: if (!hWndMain) ! 300: return (FALSE) ; ! 301: ! 302: ViewChart (hWndMain) ; ! 303: ! 304: LoadMainWindowPlacement (hWndMain) ; ! 305: ! 306: return (TRUE) ; ! 307: } // InitializeInstance ! 308: ! 309: ! 310: //==========================================================================// ! 311: // Exported Functions // ! 312: //==========================================================================// ! 313: ! 314: ! 315: BOOL PerfmonInitialize (HINSTANCE hCurrentInstance, ! 316: HINSTANCE hPrevInstance, ! 317: LPCSTR lpszCmdLine, ! 318: int nCmdShow) ! 319: /* ! 320: Effect: Performa all initializations required when Perfmon is ! 321: started. In particular, initialize all "systems", register ! 322: all window classes, create needed windows, read in and ! 323: process font and Perfmon lists. ! 324: ! 325: Called By: WinMain only, at the start of the application. ! 326: ! 327: Assert: There are no other instances of Perfmon currently ! 328: executing. ! 329: ! 330: Returns: Whether initialization was successful. If this function ! 331: returns FALSE, Perfmon should exit immediately. ! 332: ! 333: Internals: The bSuccess variable is used to conditionalize each ! 334: successive initialization step. ! 335: */ ! 336: { // PerfmonInitialize ! 337: BOOL bSuccess ; ! 338: TCHAR szFilePath [FilePathLen + 1] ; ! 339: LPTSTR pFileNameStart ; ! 340: HANDLE hFindFile ; ! 341: WIN32_FIND_DATA FindFileInfo ; ! 342: CHAR QuoteChar ; ! 343: LPSTR pCmdLine ; ! 344: int NameOffset ; ! 345: ! 346: ! 347: hInstance = hCurrentInstance ; ! 348: bSuccess = InitializeSystemValues () ; ! 349: ! 350: if (bSuccess && !hPrevInstance) ! 351: bSuccess = InitializeApplication () ; ! 352: ! 353: if (bSuccess) ! 354: bSuccess = InitializeInstance (nCmdShow, lpszCmdLine) ; ! 355: ! 356: GetDateTimeFormats() ; ! 357: ! 358: if (bSuccess) ! 359: { ! 360: ! 361: if (strempty (lpszCmdLine)) ! 362: StringLoad (IDS_DEFAULTPATH, szFilePath) ; ! 363: else ! 364: { ! 365: // check for single or double quote ! 366: QuoteChar = *lpszCmdLine ; ! 367: if (QuoteChar == '\'' || QuoteChar == '\"') ! 368: { ! 369: lpszCmdLine++ ; ! 370: ! 371: // remove the matching QuoteChar if found ! 372: pCmdLine = (LPSTR) lpszCmdLine ; ! 373: while (*pCmdLine != '\0') ! 374: { ! 375: if (*pCmdLine == QuoteChar) ! 376: { ! 377: *pCmdLine = '\0' ; ! 378: break ; ! 379: } ! 380: else ! 381: { ! 382: pCmdLine++ ; ! 383: } ! 384: } ! 385: } ! 386: ! 387: // convert the LPSTR to LPTSTR ! 388: ! 389: mbstowcs (szFilePath, lpszCmdLine, strlen(lpszCmdLine) + 1) ; ! 390: ! 391: pFileNameStart = ExtractFileName (szFilePath) ; ! 392: NameOffset = pFileNameStart - szFilePath ; ! 393: ! 394: // convert short filename to long NTFS filename if necessary ! 395: hFindFile = FindFirstFile (szFilePath, &FindFileInfo) ; ! 396: if (hFindFile && hFindFile != INVALID_HANDLE_VALUE) ! 397: { ! 398: // append the file name back to the path name ! 399: lstrcpy (&szFilePath[NameOffset], FindFileInfo.cFileName) ; ! 400: FindClose (hFindFile) ; ! 401: } ! 402: } ! 403: ! 404: // OpenFileHandler (hWndMain, szFilePath) ; ! 405: FileOpen (hWndMain, (int)0, (LPTSTR)szFilePath) ; ! 406: PrepareMenu (GetMenu (hWndMain)); ! 407: } ! 408: ! 409: return (bSuccess) ; ! 410: } // PerfmonInitialize ! 411: ! 412: ! 413: ! 414: void PerfmonClose (HWND hWndMain) ! 415: { ! 416: if (!QuerySaveChart (hWndMain, pGraphs)) ! 417: return ; ! 418: ! 419: // close the log file for now. ! 420: // need to query the user later..!! ! 421: if (LogCollecting (hWndLog)) ! 422: { ! 423: PLOG pLog = LogData (hWndLog) ; ! 424: ! 425: if (pLog) ! 426: { ! 427: CloseLog (hWndLog, pLog) ; ! 428: } ! 429: } ! 430: ! 431: ! 432: // free all the filenames ! 433: if (pChartFullFileName) ! 434: { ! 435: MemoryFree (pChartFullFileName) ; ! 436: pChartFullFileName = NULL ; ! 437: } ! 438: if (pAlertFullFileName) ! 439: { ! 440: MemoryFree (pAlertFullFileName) ; ! 441: pAlertFullFileName = NULL ; ! 442: } ! 443: if (pLogFullFileName) ! 444: { ! 445: MemoryFree (pLogFullFileName) ; ! 446: pLogFullFileName = NULL ; ! 447: } ! 448: if (pReportFullFileName) ! 449: { ! 450: MemoryFree (pReportFullFileName) ; ! 451: pReportFullFileName = NULL ; ! 452: } ! 453: ! 454: // free all the GDI resources ! 455: DeletePen (hWhitePen) ; ! 456: DeletePerfmonSystemObjects () ; ! 457: ! 458: SaveMainWindowPlacement (hWndMain) ; ! 459: DestroyWindow (hWndMain) ; ! 460: } // PerfmonClose ! 461: ! 462:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.