|
|
1.1 root 1:
2: #include "perfmon.h"
3: #include <lmcons.h>
4: #include <lmerr.h>
5: #include <lmapibuf.h>
6: #include <lmwksta.h>
7: #include <stdio.h> // for sprintf
8: #include <locale.h> // for setlocale
9: #include "utils.h"
10:
11: #include "perfdata.h" // for OpenSystemPerfData
12: #include "alert.h" // for AlertInsertLine
13: #include "report.h" // for ReportInsertLine
14: #include "grafdata.h" // for GraphInsertLine
15: #include "log.h" // for OpenLog
16: #include "fileopen.h" // for FileGetName
17: #include "fileutil.h" // for FileRead etc
18: #include "command.h" // for PrepareMenu
19: #include "playback.h" // for PlayingBackLog & LogPositionSystemTime
20: #include "system.h"
21: #include "globals.h"
22: #include "pmemory.h" // for MemoryFree
23: #include "status.h" // for StatusLineReady
24: #include "pmhelpid.h"
25:
26: // test for delimiter, end of line and non-digit characters
27: // used by IsNumberInUnicodeList routine
28: //
29: #define DIGIT 1
30: #define DELIMITER 2
31: #define INVALID 3
32:
33: // globals used for International Date and Time formats
34: enum DATE_STYLE
35: {
36: YEAR_FIRST, // YYMMDD
37: DAY_FIRST, // DDMMYY
38: MONTH_FIRST // MMDDYY
39: } DateStyle ;
40:
41: TCHAR szInternational[] = TEXT("Intl") ;
42: TCHAR sz1159[6] ; // AM String
43: TCHAR sz2359[6] ; // PM String
44: int iTime ; // = 0 for 12-hour format, <> 0 for 24-hour format
45: int YearCharCount ; // = 4 for 1990, = 2 for 90
46:
47: TCHAR szDateFormat[ResourceStringLen] ;
48: TCHAR szTimeFormat[ResourceStringLen] ;
49:
50: TCHAR LeadingZeroStr [] = TEXT("%02d") ;
51: TCHAR NoLeadingZeroStr [] = TEXT("%d") ;
52:
53: #define EvalThisChar(c,d) ( \
54: (c == d) ? DELIMITER : \
55: (c == 0) ? DELIMITER : \
56: (c < (WCHAR)'0') ? INVALID : \
57: (c > (WCHAR)'9') ? INVALID : \
58: DIGIT)
59:
60: #define SIZE_OF_BIGGEST_INTEGER 16
61: // #define SIZE_OF_BIGGEST_INTEGER (16*sizeof(WCHAR))
62:
63:
64: //==========================================================================//
65: // Typedefs //
66: //==========================================================================//
67:
68: BOOL AddObjectToSystem ( PLINE , PPERFSYSTEM );
69: BOOL GetLogFileComputer (HWND hWndParent, LPTSTR lpComputerName, DWORD BufferSize) ;
70:
71:
72: HWND PerfmonViewWindow (void)
73: /*
74: Effect: Return the current data window, i.e. the window currently
75: visible as the client area of Perfmon. This is either a
76: chart, log, alert, or report window.
77: */
78: { // PerfmonDataWindow
79: switch (iPerfmonView)
80: { // switch
81: case IDM_VIEWLOG:
82: return (hWndLog) ;
83:
84: case IDM_VIEWALERT:
85: return (hWndAlert) ;
86:
87: case IDM_VIEWREPORT:
88: return (hWndReport) ;
89:
90: // case IDM_VIEWCHART:
91: default:
92: return (hWndGraph) ;
93: } // switch
94: } // PerfmonViewWindow
95:
96:
97:
98:
99: BOOL ChooseComputer (HWND hWndParent, LPTSTR lpszComputer)
100: /*
101: Effect: Display the choose Domain/Computer dialog
102: If the user selects a computer, copy the
103: computer name to lpszComputer and return
104: nonnull. If the user cancels, return FALSE.
105:
106: Assert: lpszComputer is at least MAX_SYSTEM_NAME_LENGTH + 1
107: characters.
108: */
109: { // ChooseComputer
110: BOOL bSuccess ;
111: WCHAR wszWideComputer[MAX_COMPUTERNAME_LENGTH + 3] ;
112:
113: // bring up the select Log Computer dialog
114: bSuccess = GetLogFileComputer (hWndParent, wszWideComputer,
115: sizeof(wszWideComputer) / sizeof(WCHAR)) ;
116:
117: if (bSuccess)
118: {
119: lstrcpy (lpszComputer, wszWideComputer) ;
120: }
121:
122: return (bSuccess) ;
123: } // ChooseComputer
124:
125:
126: void SystemTimeDateString (SYSTEMTIME *pSystemTime,
127: LPTSTR lpszDate)
128: {
129: int wYear ;
130:
131: wYear = pSystemTime->wYear ;
132: if (YearCharCount == 2)
133: {
134: wYear %= 100 ;
135: }
136:
137: switch (DateStyle)
138: {
139: case YEAR_FIRST:
140: TSPRINTF (lpszDate, szDateFormat,
141: wYear, pSystemTime->wMonth, pSystemTime->wDay) ;
142: break ;
143:
144: case DAY_FIRST:
145: TSPRINTF (lpszDate, szDateFormat,
146: pSystemTime->wDay, pSystemTime->wMonth, wYear) ;
147: break ;
148:
149: case MONTH_FIRST:
150: default:
151: TSPRINTF (lpszDate, szDateFormat,
152: pSystemTime->wMonth, pSystemTime->wDay, wYear) ;
153: break ;
154: }
155: }
156:
157:
158: void SystemTimeTimeString (SYSTEMTIME *pSystemTime,
159: LPTSTR lpszTime)
160: {
161: int iHour ;
162: BOOL bPM ;
163:
164: if (iTime)
165: {
166: // 24 hor format
167: TSPRINTF (lpszTime, szTimeFormat,
168: pSystemTime->wHour,
169: pSystemTime->wMinute,
170: (FLOAT)pSystemTime->wSecond +
171: (FLOAT)pSystemTime->wMilliseconds / (FLOAT) 1000.0) ;
172:
173: }
174: else
175: {
176: // 12 hour format
177: iHour = pSystemTime->wHour ;
178: bPM = (iHour >= 12) ;
179:
180: if (iHour > 12)
181: iHour -= 12 ;
182: else if (!iHour)
183: iHour = 12 ;
184:
185: TSPRINTF (lpszTime, szTimeFormat,
186: iHour, pSystemTime->wMinute,
187: (FLOAT)pSystemTime->wSecond +
188: (FLOAT)pSystemTime->wMilliseconds / (FLOAT) 1000.0 ,
189: bPM ? sz2359 : sz1159) ;
190: }
191: }
192:
193:
194: void ShowPerfmonMenu (BOOL bMenu)
195: { // ShowPerfmonMenu
196: if (!bMenu)
197: {
198: WindowEnableTitle (hWndMain, FALSE) ;
199: // SetMenu(hWndMain, NULL) ;
200: }
201: else
202: {
203: WindowEnableTitle (hWndMain, TRUE) ;
204: switch (iPerfmonView)
205: { // switch
206: case IDM_VIEWCHART:
207: SetMenu (hWndMain, hMenuChart) ;
208: break ;
209:
210: case IDM_VIEWALERT:
211: SetMenu (hWndMain, hMenuAlert) ;
212: break ;
213:
214: case IDM_VIEWLOG:
215: SetMenu (hWndMain, hMenuLog) ;
216: break ;
217:
218: case IDM_VIEWREPORT:
219: SetMenu (hWndMain, hMenuReport) ;
220: break ;
221: } // switch
222: } // else
223:
224: if (bMenu != Options.bMenubar)
225: {
226: PrepareMenu (GetMenu (hWndMain)) ;
227: }
228:
229: Options.bMenubar = bMenu ;
230: } // ShowPerfmonMenu
231:
232:
233:
234: void SmallFileSizeString (int iFileSize,
235: LPTSTR lpszFileText)
236: { // SmallFileSizeString
237: if (iFileSize < 1000000)
238: TSPRINTF (lpszFileText, TEXT(" %1.1fK "), ((FLOAT) iFileSize) / 1000.0) ;
239: else
240: TSPRINTF (lpszFileText, TEXT(" %1.1fM "), ((FLOAT) iFileSize) / 1000000.0) ;
241: } // SmallFileSizeString
242:
243:
244:
245: BOOL DoWindowDrag (LPARAM lParam)
246: {
247: if (!Options.bMenubar && !IsZoomed (hWndMain))
248: {
249: SendMessage (hWndMain, WM_NCLBUTTONDOWN, HTCAPTION, lParam) ;
250: return (TRUE) ;
251: }
252: else
253: return (FALSE) ;
254: }
255:
256:
257:
258: // Filetimes are in 100NS units
259: #define FILETIMES_PER_SECOND 10000000
260:
261:
262: int SystemTimeDifference (SYSTEMTIME *pst1, SYSTEMTIME *pst2)
263: {
264: LARGE_INTEGER li1, li2 ;
265: LARGE_INTEGER liDifference, liDifferenceSeconds ;
266: DWORD uRemainder ;
267:
268:
269: SystemTimeToFileTime (pst1, (FILETIME *) &li1) ;
270: SystemTimeToFileTime (pst2, (FILETIME *) &li2) ;
271:
272: liDifference = LargeIntegerSubtract (li2, li1) ;
273: liDifference.LowPart += (FILETIMES_PER_SECOND / 2) ;
274:
275: liDifferenceSeconds =
276: ExtendedLargeIntegerDivide (liDifference, FILETIMES_PER_SECOND,
277: &uRemainder) ;
278:
279: return (liDifferenceSeconds.LowPart) ;
280: }
281:
282:
283: BOOL InsertLine (PLINE pLine)
284: { // InsertLine
285:
286: BOOL bReturn;
287:
288: switch (pLine->iLineType) { // switch
289: case LineTypeChart:
290: bReturn = ChartInsertLine (pGraphs, pLine) ;
291: break ;
292:
293: case LineTypeAlert:
294: bReturn = AlertInsertLine (hWndAlert, pLine) ;
295: break ;
296:
297: case LineTypeReport:
298: bReturn = ReportInsertLine (hWndReport, pLine) ;
299: break ;
300:
301: } // switch
302:
303: return bReturn;
304:
305: } // InsertLine
306:
307:
308: BOOL OpenWorkspace (HANDLE hFile, DWORD dwMajorVersion, DWORD dwMinorVersion)
309: {
310: DISKWORKSPACE DiskWorkspace ;
311:
312: if (!FileRead (hFile, &DiskWorkspace, sizeof(DiskWorkspace)))
313: {
314: goto Exit0 ;
315: }
316:
317: if (DiskWorkspace.ChartOffset == 0 &&
318: DiskWorkspace.AlertOffset == 0 &&
319: DiskWorkspace.LogOffset == 0 &&
320: DiskWorkspace.ReportOffset == 0)
321: {
322: goto Exit0 ;
323: }
324:
325: switch (dwMajorVersion)
326: { // switch
327: case (1):
328:
329: if (dwMinorVersion == 1 || dwMinorVersion == 2)
330: {
331: // setup the window position and size
332: SetWindowPlacement (hWndMain, &(DiskWorkspace.WindowPlacement)) ;
333: }
334:
335: // change to the view as stored in the workspace file
336: SendMessage (hWndMain, WM_COMMAND,
337: (LONG)DiskWorkspace.iPerfmonView, 0L) ;
338: iPerfmonView = DiskWorkspace.iPerfmonView ;
339:
340: if (DiskWorkspace.ChartOffset)
341: {
342: if (FileSeekBegin(hFile, DiskWorkspace.ChartOffset) == 0xFFFFFFFF)
343: {
344: goto Exit0 ;
345: }
346:
347: if (!OpenChart (hWndGraph,
348: hFile,
349: dwMajorVersion,
350: dwMinorVersion,
351: FALSE))
352: {
353: goto Exit0 ;
354: }
355: }
356: if (DiskWorkspace.AlertOffset)
357: {
358: if (FileSeekBegin(hFile, DiskWorkspace.AlertOffset) == 0xffffffff)
359: {
360: goto Exit0 ;
361: }
362: if (!OpenAlert (hWndAlert,
363: hFile,
364: dwMajorVersion,
365: dwMinorVersion,
366: FALSE))
367: {
368: goto Exit0 ;
369: }
370: }
371: if (DiskWorkspace.LogOffset)
372: {
373: if (FileSeekBegin(hFile, DiskWorkspace.LogOffset) == 0xffffffff)
374: {
375: goto Exit0 ;
376: }
377: if (!OpenLog (hWndLog,
378: hFile,
379: dwMajorVersion,
380: dwMinorVersion,
381: FALSE))
382: {
383: goto Exit0 ;
384: }
385: }
386: if (DiskWorkspace.ReportOffset)
387: {
388: if (FileSeekBegin(hFile, DiskWorkspace.ReportOffset) == 0xffffffff)
389: {
390: goto Exit0 ;
391: }
392: if (!OpenReport (hWndReport,
393: hFile,
394: dwMajorVersion,
395: dwMinorVersion,
396: FALSE))
397: {
398: goto Exit0 ;
399: }
400: }
401: break ;
402:
403: default:
404: goto Exit0 ;
405: break ;
406: }
407:
408: CloseHandle (hFile) ;
409: return (TRUE) ;
410:
411:
412: Exit0:
413: CloseHandle (hFile) ;
414: return (FALSE) ;
415:
416: } // OpenWorkspace
417:
418:
419: BOOL SaveWorkspace (void)
420: {
421: DISKWORKSPACE DiskWorkspace ;
422: PERFFILEHEADER FileHeader ;
423: HANDLE hFile ;
424: long DiskWorkspacePosition ;
425: TCHAR szFileName[FilePathLen] ;
426: BOOL bWriteErr = TRUE ;
427:
428: if (!FileGetName (PerfmonViewWindow(), IDS_WORKSPACEFILE, szFileName))
429: {
430: return (FALSE) ;
431: }
432:
433: hFile = FileHandleCreate (szFileName) ;
434: if (!hFile)
435: {
436: DlgErrorBox (PerfmonViewWindow (), ERR_CANT_OPEN, szFileName) ;
437: return (FALSE) ;
438: }
439:
440: memset (&FileHeader, 0, sizeof (FileHeader)) ;
441: lstrcpy (FileHeader.szSignature, szPerfWorkspaceSignature) ;
442: FileHeader.dwMajorVersion = WorkspaceMajorVersion ;
443: FileHeader.dwMinorVersion = WorkspaceMinorVersion ;
444:
445: if (!FileWrite (hFile, &FileHeader, sizeof (PERFFILEHEADER)))
446: {
447: goto Exit0 ;
448: }
449:
450: // reserve space in the file. We will fill up info
451: // and write into this guy later.
452: memset (&DiskWorkspace, 0, sizeof(DiskWorkspace)) ;
453: DiskWorkspacePosition = FileTell (hFile) ;
454: GetWindowPlacement (hWndMain, &(DiskWorkspace.WindowPlacement)) ;
455: if (!FileWrite (hFile, &DiskWorkspace, sizeof (DISKWORKSPACE)))
456: {
457: goto Exit0 ;
458: }
459:
460: // put in chart data
461: DiskWorkspace.ChartOffset = FileTell (hFile) ;
462: if (!SaveChart (hWndGraph, hFile, 0))
463: {
464: goto Exit0 ;
465: }
466:
467: // put in alert data
468: DiskWorkspace.AlertOffset = FileTell (hFile) ;
469: if (!SaveAlert (hWndAlert, hFile, 0))
470: {
471: goto Exit0 ;
472: }
473:
474: // put in log data
475: DiskWorkspace.LogOffset = FileTell (hFile) ;
476: if (!SaveLog (hWndLog, hFile, 0))
477: {
478: goto Exit0 ;
479: }
480:
481: // put in report data
482: DiskWorkspace.ReportOffset = FileTell (hFile) ;
483: if (!SaveReport (hWndReport, hFile, 0))
484: {
485: goto Exit0 ;
486: }
487:
488: // put in the disk header info
489: DiskWorkspace.iPerfmonView = iPerfmonView ;
490: FileSeekBegin (hFile, DiskWorkspacePosition) ;
491: if (!FileWrite (hFile, &DiskWorkspace, sizeof (DISKWORKSPACE)))
492: {
493: goto Exit0 ;
494: }
495: bWriteErr = FALSE ;
496:
497: Exit0:
498: if (bWriteErr)
499: {
500: DlgErrorBox (PerfmonViewWindow (), ERR_SETTING_FILE, szFileName) ;
501: }
502:
503: CloseHandle (hFile) ;
504:
505: } // SaveWorkspace
506:
507: void SetPerfmonOptions (OPTIONS *pOptions)
508: {
509: Options = *pOptions ;
510: ShowPerfmonMenu (Options.bMenubar) ;
511: SizePerfmonComponents () ;
512: WindowSetTopmost (hWndMain, Options.bAlwaysOnTop) ;
513: } // SetPerfmonOptions
514:
515: void ChangeSaveFileName (LPTSTR szFileName, int iPMView)
516: {
517: LPTSTR *ppFullName ;
518: LPTSTR *ppFileName ;
519: BOOL errorInput = FALSE ;
520:
521:
522: switch (iPMView)
523: {
524: case IDM_VIEWCHART:
525: ppFileName = &pChartFileName ;
526: ppFullName = &pChartFullFileName ;
527: break ;
528:
529: case IDM_VIEWALERT:
530: ppFileName = &pAlertFileName ;
531: ppFullName = &pAlertFullFileName ;
532: break ;
533:
534: case IDM_VIEWREPORT:
535: ppFileName = &pReportFileName ;
536: ppFullName = &pReportFullFileName ;
537: break ;
538:
539: case IDM_VIEWLOG:
540: ppFileName = &pLogFileName ;
541: ppFullName = &pLogFullFileName ;
542: break ;
543:
544: default:
545: errorInput = TRUE ;
546: break ;
547: }
548:
549: if (errorInput)
550: {
551: return ;
552: }
553:
554: // release last filename
555: if (*ppFullName)
556: {
557: MemoryFree (*ppFullName) ;
558: *ppFileName = NULL ;
559: *ppFullName = NULL ;
560: }
561:
562: // allocate new file name and display it
563: if (szFileName && (*ppFullName = StringAllocate (szFileName)))
564: {
565: *ppFileName = ExtractFileName (*ppFullName) ;
566: }
567:
568: StatusLineReady (hWndStatus) ;
569:
570: } // ChangeSaveFileName
571:
572:
573:
574:
575: BOOL
576: IsNumberInUnicodeList (
577: IN DWORD dwNumber,
578: IN LPWSTR lpwszUnicodeList
579: )
580: /*++
581:
582: IsNumberInUnicodeList
583:
584: Arguments:
585:
586: IN dwNumber
587: DWORD number to find in list
588:
589: IN lpwszUnicodeList
590: Null terminated, Space delimited list of decimal numbers
591:
592: Return Value:
593:
594: TRUE:
595: dwNumber was found in the list of unicode number strings
596:
597: FALSE:
598: dwNumber was not found in the list.
599:
600: --*/
601: {
602: DWORD dwThisNumber;
603: WCHAR *pwcThisChar;
604: BOOL bValidNumber;
605: BOOL bNewItem;
606: WCHAR wcDelimiter; // could be an argument to be more flexible
607:
608: if (lpwszUnicodeList == 0) return FALSE; // null pointer, # not founde
609:
610: pwcThisChar = lpwszUnicodeList;
611: dwThisNumber = 0;
612: wcDelimiter = (WCHAR)' ';
613: bValidNumber = FALSE;
614: bNewItem = TRUE;
615:
616: while (TRUE) {
617: switch (EvalThisChar (*pwcThisChar, wcDelimiter)) {
618: case DIGIT:
619: // if this is the first digit after a delimiter, then
620: // set flags to start computing the new number
621: if (bNewItem) {
622: bNewItem = FALSE;
623: bValidNumber = TRUE;
624: }
625: if (bValidNumber) {
626: dwThisNumber *= 10;
627: dwThisNumber += (*pwcThisChar - (WCHAR)'0');
628: }
629: break;
630:
631: case DELIMITER:
632: // a delimter is either the delimiter character or the
633: // end of the string ('\0') if when the delimiter has been
634: // reached a valid number was found, then compare it to the
635: // number from the argument list. if this is the end of the
636: // string and no match was found, then return.
637: //
638: if (bValidNumber) {
639: if (dwThisNumber == dwNumber) return TRUE;
640: bValidNumber = FALSE;
641: }
642: if (*pwcThisChar == 0) {
643: return FALSE;
644: } else {
645: bNewItem = TRUE;
646: dwThisNumber = 0;
647: }
648: break;
649:
650: case INVALID:
651: // if an invalid character was encountered, ignore all
652: // characters up to the next delimiter and then start fresh.
653: // the invalid number is not compared.
654: bValidNumber = FALSE;
655: break;
656:
657: default:
658: break;
659:
660: }
661: pwcThisChar++;
662: }
663:
664: } // IsNumberInUnicodeList
665:
666: BOOL
667: AppendObjectToValueList (
668: DWORD dwObjectId,
669: PWSTR pwszValueList
670: )
671: /*++
672:
673: AppendObjectToValueList
674:
675: Arguments:
676:
677: IN dwNumber
678: DWORD number to insert in list
679:
680: IN PUNICODE_STRING
681: pointer to unicode string structure that contains buffer that is
682: Null terminated, Space delimited list of decimal numbers that
683: may have this number appended to.
684:
685: Return Value:
686:
687: TRUE:
688: dwNumber was added to list
689:
690: FALSE:
691: dwNumber was not added. (because it's already there or
692: an error occured)
693:
694: --*/
695: {
696: WCHAR tempString [SIZE_OF_BIGGEST_INTEGER] ;
697: DWORD dwStrLen, dwNewStrLen;
698:
699: if (!pwszValueList) {
700: return FALSE;
701: }
702:
703: if (IsNumberInUnicodeList(dwObjectId, pwszValueList)) {
704: return FALSE; // object already in list
705: } else {
706: // append the new object id the value list
707: TSPRINTF (tempString, TEXT("%d "), dwObjectId) ;
708:
709: // see if string will fit (compare in bytes)
710:
711: dwStrLen = MemorySize (pwszValueList) - sizeof (UNICODE_NULL);
712:
713: dwNewStrLen = (lstrlen (pwszValueList) + lstrlen (tempString)) *
714: sizeof (WCHAR);
715:
716: if (dwNewStrLen <= dwStrLen) {
717: lstrcat (pwszValueList, tempString);
718: return TRUE;
719: } else {
720: SetLastError (ERROR_OUTOFMEMORY);
721: return FALSE;
722: }
723: }
724: }
725:
726: BOOL
727: AddObjectToSystem (
728: PLINE pLine,
729: PPERFSYSTEM pFirstSystem
730: )
731: {
732: PPERFSYSTEM pSystem;
733:
734: if ((ARGUMENT_PRESENT (pLine)) && (ARGUMENT_PRESENT(pFirstSystem))) {
735: pSystem = SystemGet (pFirstSystem, pLine->lnSystemName);
736:
737: if (pSystem) {
738: return AppendObjectToValueList (
739: pLine->lnObject.ObjectNameTitleIndex,
740: pSystem->lpszValue);
741: } else {
742: return FALSE;
743: }
744: } else {
745: return FALSE;
746: }
747: }
748:
749: BOOL
750: RemoveObjectsFromSystem (
751: PPERFSYSTEM pSystem
752: )
753: {
754: DWORD dwBufferSize = 0;
755:
756: if (ARGUMENT_PRESENT (pSystem)) {
757: // don't do foreign computers
758: if (pSystem->lpszValue && !strsame (pSystem->lpszValue, L"Foreign")){
759: dwBufferSize = MemorySize (pSystem->lpszValue);
760:
761: memset (pSystem->lpszValue, 0, dwBufferSize);
762: return TRUE;
763: } else {
764: return FALSE;
765: }
766: } else {
767: return FALSE;
768: }
769:
770:
771: }
772:
773: BOOL
774: BuildValueListForSystems (
775: PPERFSYSTEM pSystemListHead,
776: PLINE pLineListHead
777: )
778: /*++
779:
780: BuildValueListForSystem
781:
782: Abstract:
783:
784: Walks down line list and builds the list of objects to query from
785: that system containing that line.
786:
787: Arguments:
788:
789: pSystemListHead
790:
791: head of system linked list
792: each system will have it's "Value Name" list appended
793:
794: pLineListHead
795:
796: head of line list that will be searched for creating the new
797: valuelist.
798:
799:
800: Return Value:
801:
802:
803: --*/
804: {
805:
806: PPERFSYSTEM pSystem; // system that contains current line
807: PLINE pThisLine; // current line
808:
809: if ((ARGUMENT_PRESENT (pLineListHead)) && (ARGUMENT_PRESENT(pSystemListHead))) {
810: // clear system entries:
811: for (pSystem = pSystemListHead; pSystem; pSystem = pSystem->pSystemNext) {
812: if (pSystem) {
813: RemoveObjectsFromSystem (pSystem);
814: }
815: }
816:
817: // add new enties
818:
819: for (pThisLine = pLineListHead; pThisLine; pThisLine = pThisLine->pLineNext) {
820:
821: pSystem = SystemGet (pSystemListHead, pThisLine->lnSystemName);
822: if (pSystem) {
823: AppendObjectToValueList (
824: pThisLine->lnObject.ObjectNameTitleIndex,
825: pSystem->lpszValue);
826:
827: }
828: }
829: return TRUE;
830: } else { // argument(s) missing
831: return FALSE;
832: }
833: }
834:
835: // define in Addline.c
836: extern PLINESTRUCT pLineEdit ;
837: #define bEditLine (pLineEdit != NULL)
838:
839: BOOL
840: SetSystemValueNameToGlobal (
841: PPERFSYSTEM pSystem
842: )
843: {
844:
845: if (!bEditLine && ARGUMENT_PRESENT(pSystem)) {
846: if (pSystem->lpszValue && RemoveObjectsFromSystem(pSystem)) {
847: lstrcpy (
848: pSystem->lpszValue,
849: TEXT("Global ")) ;
850: return TRUE;
851: } else {
852: return FALSE;
853: }
854: } else {
855: return FALSE;
856: }
857: }
858:
859: BOOL
860: RemoveUnusedSystems (
861: PPERFSYSTEM pSystemHead,
862: PLINE pLineHead
863: )
864: /*++
865:
866: walks system list and removes systems with no lines from list
867:
868: --*/
869: {
870: PPERFSYSTEM pSystem;
871: PPERFSYSTEM pLastSystem;
872: PLINE pLine;
873: BOOL bSystemFound;
874:
875: pLastSystem = NULL;
876:
877: if ((ARGUMENT_PRESENT (pLineHead)) && (ARGUMENT_PRESENT(pSystemHead))) {
878: for (pSystem = pSystemHead;
879: pSystem;
880: pLastSystem = pSystem, pSystem = pSystem->pSystemNext) {
881:
882: if (pSystem) {
883: bSystemFound = FALSE;
884: // walk lines to see if this system has a line
885: for (pLine = pLineHead; pLine; pLine = pLine->pLineNext) {
886: // if system in line is this system, then bailout
887: if (strsame (pLine->lnSystemName, pSystem->sysName)) {
888: bSystemFound = TRUE;
889: break;
890: }
891: }
892:
893: if (!bSystemFound) { // delete this unused system
894:
895: // fix pointers
896: pLastSystem->pSystemNext = pSystem->pSystemNext;
897:
898: SystemFree (pSystem, TRUE);
899:
900: // set pointer back to a valid structure
901: pSystem = pLastSystem;
902: }
903: }
904: }
905: }
906: return TRUE;
907: }
908:
909: void CreatePerfmonSystemObjects ()
910: {
911: ColorBtnFace = GetSysColor (COLOR_BTNFACE) ;
912: hBrushFace = CreateSolidBrush (ColorBtnFace) ;
913: hPenHighlight = CreatePen (PS_SOLID, 1, GetSysColor (COLOR_BTNHIGHLIGHT)) ;
914: hPenShadow = CreatePen (PS_SOLID, 1, GetSysColor (COLOR_BTNSHADOW)) ;
915: }
916:
917: void DeletePerfmonSystemObjects ()
918: {
919: if (hBrushFace)
920: {
921: DeleteBrush (hBrushFace) ;
922: hBrushFace = 0 ;
923: }
924: if (hPenHighlight)
925: {
926: DeletePen (hPenHighlight) ;
927: hPenHighlight = 0 ;
928: }
929: if (hPenShadow)
930: {
931: DeletePen (hPenShadow) ;
932: hPenShadow = 0 ;
933: }
934: }
935:
936: // This routine count the number of the same charatcer in the input string
937: int SameCharCount (LPTSTR pInputString)
938: {
939: int Count = 0 ;
940: TCHAR InputChar = *pInputString ;
941:
942: if (InputChar)
943: {
944: while (InputChar == *pInputString)
945: {
946: Count ++ ;
947: pInputString ++ ;
948: }
949: }
950: return (Count) ;
951: }
952:
953: // create the format to be used in SystemTimeDateString()
954: BOOL CreateDateFormat (LPTSTR pShortDate)
955: {
956: int iIndex ;
957: int iDayCount ;
958: int iMonthCount ;
959: int DateSeparatorCount ;
960: TCHAR szDateSeparator [10] ;
961: BOOL bFirstLeading, bSecondLeading, bThirdLeading ;
962:
963: // get the date format based on the first char
964: if (*pShortDate == TEXT('M') || *pShortDate == TEXT('m'))
965: {
966: DateStyle = MONTH_FIRST ;
967: }
968: else if (*pShortDate == TEXT('D') || *pShortDate == TEXT('d'))
969: {
970: DateStyle = DAY_FIRST ;
971: }
972: else if (*pShortDate == TEXT('Y') || *pShortDate == TEXT('y'))
973: {
974: DateStyle = YEAR_FIRST ;
975: }
976: else
977: {
978: // bad format
979: return FALSE ;
980: }
981:
982: bFirstLeading = bSecondLeading = bThirdLeading = FALSE ;
983:
984: switch (DateStyle)
985: {
986: case YEAR_FIRST:
987: // YYYY-MM-DD
988: YearCharCount = SameCharCount (pShortDate) ;
989: pShortDate += YearCharCount ;
990: DateSeparatorCount = SameCharCount (pShortDate) ;
991:
992: // get the separator string
993: for (iIndex = 0; iIndex < DateSeparatorCount; iIndex ++)
994: {
995: szDateSeparator [iIndex] = *pShortDate++ ;
996: }
997: szDateSeparator [iIndex] = TEXT('\0') ;
998:
999: iMonthCount = SameCharCount (pShortDate) ;
1000: pShortDate += iMonthCount + DateSeparatorCount ;
1001: iDayCount = SameCharCount (pShortDate) ;
1002:
1003: if (YearCharCount == 2)
1004: {
1005: bFirstLeading = TRUE ;
1006: }
1007:
1008: if (iMonthCount == 2)
1009: {
1010: bSecondLeading = TRUE ;
1011: }
1012:
1013: if (iDayCount == 2)
1014: {
1015: bThirdLeading = TRUE ;
1016: }
1017:
1018: break ;
1019:
1020: case MONTH_FIRST:
1021: // MM-DD-YYYY
1022: iMonthCount = SameCharCount (pShortDate) ;
1023: pShortDate += iMonthCount ;
1024: DateSeparatorCount = SameCharCount (pShortDate) ;
1025:
1026: // get the separator string
1027: for (iIndex = 0; iIndex < DateSeparatorCount; iIndex ++)
1028: {
1029: szDateSeparator [iIndex] = *pShortDate++ ;
1030: }
1031: szDateSeparator [iIndex] = TEXT('\0') ;
1032:
1033: iDayCount = SameCharCount (pShortDate) ;
1034: pShortDate += iMonthCount + DateSeparatorCount ;
1035: YearCharCount = SameCharCount (pShortDate) ;
1036:
1037:
1038: if (iMonthCount == 2)
1039: {
1040: bFirstLeading = TRUE ;
1041: }
1042:
1043: if (iDayCount == 2)
1044: {
1045: bSecondLeading = TRUE ;
1046: }
1047:
1048: if (YearCharCount == 2)
1049: {
1050: bThirdLeading = TRUE ;
1051: }
1052:
1053: break ;
1054:
1055: case DAY_FIRST:
1056: // DD-MM-YYYY
1057: iDayCount = SameCharCount (pShortDate) ;
1058: pShortDate += iDayCount ;
1059: DateSeparatorCount = SameCharCount (pShortDate) ;
1060:
1061: // get the separator string
1062: for (iIndex = 0; iIndex < DateSeparatorCount; iIndex ++)
1063: {
1064: szDateSeparator [iIndex] = *pShortDate++ ;
1065: }
1066: szDateSeparator [iIndex] = TEXT('\0') ;
1067:
1068: iMonthCount = SameCharCount (pShortDate) ;
1069: pShortDate += iMonthCount + DateSeparatorCount ;
1070: YearCharCount = SameCharCount (pShortDate) ;
1071:
1072: if (iDayCount == 2)
1073: {
1074: bFirstLeading = TRUE ;
1075: }
1076:
1077: if (iMonthCount == 2)
1078: {
1079: bSecondLeading = TRUE ;
1080: }
1081:
1082: if (YearCharCount == 2)
1083: {
1084: bThirdLeading = TRUE ;
1085: }
1086:
1087: break ;
1088: }
1089:
1090: // now generate the date format
1091: lstrcpy (szDateFormat, bFirstLeading ? LeadingZeroStr : NoLeadingZeroStr) ;
1092: lstrcat (szDateFormat, szDateSeparator) ;
1093: lstrcat (szDateFormat, bSecondLeading ? LeadingZeroStr : NoLeadingZeroStr) ;
1094: lstrcat (szDateFormat, szDateSeparator) ;
1095: lstrcat (szDateFormat, bThirdLeading ? LeadingZeroStr : NoLeadingZeroStr) ;
1096:
1097: return TRUE ;
1098: }
1099:
1100: BOOL CreateTimeFormat (LPTSTR pTimeSeparator, int iLeadingZero)
1101: {
1102: // create the format to be used in SystemTimeTimeString
1103: if (iLeadingZero)
1104: {
1105: lstrcpy (szTimeFormat, LeadingZeroStr) ;
1106: }
1107: else
1108: {
1109: lstrcpy (szTimeFormat, NoLeadingZeroStr) ;
1110: }
1111:
1112: lstrcat (szTimeFormat, pTimeSeparator) ;
1113: lstrcat (szTimeFormat, LeadingZeroStr) ;
1114: lstrcat (szTimeFormat, pTimeSeparator) ;
1115: // lstrcat (szTimeFormat, LeadingZeroStr) ;
1116:
1117: // for the msec
1118: lstrcat (szTimeFormat, TEXT("%02.1f")) ;
1119: if (iTime == 0)
1120: {
1121: lstrcat (szTimeFormat, TEXT(" %s ")) ;
1122: }
1123:
1124: return TRUE ;
1125: } // CreateTimeFormats
1126:
1127: BOOL GetInternational()
1128: {
1129: TCHAR szShortDate[40] ;
1130: TCHAR szTime[40] ; // time separator
1131: DWORD RetCode ;
1132: int iTLZero = 0; // = 0 for no leading zero, <> 0 for leading zero
1133: CHAR aLanguageStr [2] ;
1134: LPSTR pRetStr ;
1135:
1136: // read the data from the win.ini (which i smapped to registry)
1137: RetCode = GetProfileString(szInternational,
1138: TEXT("sShortDate"), szShortDate, szShortDate, sizeof(szShortDate)/sizeof(TCHAR));
1139:
1140: if (RetCode)
1141: {
1142: RetCode = GetProfileString(szInternational,
1143: TEXT("sTime"), szTime, szTime, sizeof(szTime)/sizeof(TCHAR));
1144: }
1145:
1146:
1147: if (RetCode)
1148: {
1149: iTime = GetProfileInt(szInternational, TEXT("iTime"), iTime);
1150: iTLZero = GetProfileInt(szInternational, TEXT("iTLZero"), iTLZero);
1151:
1152: if (iTime == 0)
1153: {
1154: // get the AM PM strings for 12-hour format.
1155: // These two strings could be NULL.
1156: sz1159[0] = sz2359[0] = TEXT('\0') ;
1157: GetProfileString(szInternational,
1158: TEXT("s1159"), sz1159, sz1159, sizeof(sz1159)/sizeof(TCHAR));
1159:
1160: GetProfileString(szInternational,
1161: TEXT("s2359"), sz2359, sz2359, sizeof(sz2359)/sizeof(TCHAR));
1162: }
1163: }
1164:
1165: // create the two formats
1166: if (RetCode)
1167: {
1168: RetCode = (DWORD) CreateDateFormat (szShortDate) ;
1169: }
1170:
1171: if (RetCode)
1172: {
1173: RetCode = (DWORD) CreateTimeFormat (szTime, iTLZero) ;
1174: }
1175:
1176: // use the system default language numeric
1177: aLanguageStr[0] = '\0' ;
1178: pRetStr = setlocale(LC_NUMERIC, aLanguageStr);
1179:
1180: return (RetCode != 0) ;
1181: } // GetInternational
1182:
1183:
1184: // this routine is called to get the date/time formats either
1185: // for the resource or from the registry.
1186: void GetDateTimeFormats ()
1187: {
1188: PALERT pAlert ;
1189: PLOG pLog ;
1190: if (!GetInternational())
1191: {
1192: // GetInternational failed, then get default formats from resource
1193: iTime = 0 ;
1194: DateStyle = MONTH_FIRST ;
1195: YearCharCount = 4 ;
1196: StringLoad (IDS_S1159, sz1159) ;
1197: StringLoad (IDS_S2359, sz2359) ;
1198: StringLoad (IDS_TIME_FORMAT, szTimeFormat) ;
1199: StringLoad (IDS_SHORT_DATE_FORMAT, szDateFormat) ;
1200: }
1201: WindowInvalidate (PerfmonViewWindow()) ;
1202:
1203: // reset all the field taht may be affected by the
1204: // language numberic changes
1205:
1206: pAlert = AlertData (hWndMain) ;
1207: pLog = LogData (hWndMain) ;
1208:
1209: if (pAlert)
1210: {
1211: DialogSetInterval (hWndAlert, IDD_ALERTINTERVAL, pAlert->iIntervalMSecs) ;
1212: }
1213:
1214: if (pLog)
1215: {
1216: DialogSetInterval (hWndLog, IDD_LOGINTERVAL, pLog->iIntervalMSecs) ;
1217: }
1218: } // GetDateTimeFormats
1219:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.