|
|
1.1 ! root 1: //=========================================================================== ! 2: // ! 3: // Module: WINAT.C ! 4: // ! 5: // Purpose: Main program for WINAT.exe. This program is a GUI Windows ! 6: // NT AT Command Scheduler. The base code was taken from the ! 7: // Windows NT AT command files. I have preserved (mostly) the ! 8: // same algorithms and data structures. ! 9: // ! 10: // Author: Kory Gill ! 11: // ! 12: // Date : March 1993 ! 13: // ! 14: // Copyright: Copyright Microsoft Corporation 1993 ! 15: // ! 16: // Original banner from Windows NT at.c ! 17: // ! 18: // /*++ ! 19: // ! 20: // Copyright (c) 1987-1992 Microsoft Corporation ! 21: // ! 22: // Module Name: ! 23: // ! 24: // atcmd.c ! 25: // ! 26: // Abstract: ! 27: // ! 28: // Code for AT command, to be used with SCHEDULE service on ! 29: // Windows NT. ! 30: // ! 31: // The module was taken from LanManager\at.c and then modified ! 32: // considerably to work with NT Schedule service. ! 33: // ! 34: // Author: ! 35: // ! 36: // Vladimir Z. Vulovic (vladimv) 06 - November - 1992 ! 37: // ! 38: // Environment: ! 39: // ! 40: // User Mode - Win32 ! 41: // ! 42: // Revision History: ! 43: // ! 44: // 06-Nov-1992 vladimv ! 45: // Created ! 46: // ! 47: // 20-Feb-1993 yihsins ! 48: // Get rid of hard coded strings and parse/print time according ! 49: // to user profile ! 50: // ! 51: // --*/ ! 52: // ! 53: //=========================================================================== ! 54: ! 55: ! 56: //=========================================================================== ! 57: // includes ! 58: //=========================================================================== ! 59: ! 60: #include <windows.h> // required for all Windows applications ! 61: #include "lmcons.h" // LAN Manager defines ! 62: #include "MYnetmsg.h" // APE2 defines ! 63: #include "lmerr.h" // LAN Manager error messages ! 64: #include "lmat.h" // AT Command prototypes ! 65: #include "lmapibuf.h" // NetApiBufferFree ! 66: #include "WINAT.h" // specific to this program ! 67: #include "listhapi.h" // hotizontal listbox routines ! 68: #include <assert.h> // assert ! 69: #include <stdio.h> // assert ! 70: ! 71: ! 72: //=========================================================================== ! 73: // global variables ! 74: //=========================================================================== ! 75: ! 76: ATTIME AtTime[NUM_TIMES] = // time strings and ms since 12am ! 77: { ! 78: "00:00", 0, "00:30", 0, "01:00", 0, "01:30", 0, ! 79: "02:00", 0, "02:30", 0, "03:00", 0, "03:30", 0, ! 80: "04:00", 0, "04:30", 0, "05:00", 0, "05:30", 0, ! 81: "06:00", 0, "06:30", 0, "07:00", 0, "07:30", 0, ! 82: "08:00", 0, "08:30", 0, "09:00", 0, "09:30", 0, ! 83: "10:00", 0, "10:30", 0, "11:00", 0, "11:30", 0, ! 84: "12:00", 0, "12:30", 0, "13:00", 0, "13:30", 0, ! 85: "14:00", 0, "14:30", 0, "15:00", 0, "15:30", 0, ! 86: "16:00", 0, "16:30", 0, "17:00", 0, "17:30", 0, ! 87: "18:00", 0, "18:30", 0, "19:00", 0, "19:30", 0, ! 88: "20:00", 0, "20:30", 0, "21:00", 0, "21:30", 0, ! 89: "22:00", 0, "22:30", 0, "23:00", 0, "23:30", 0 ! 90: }; ! 91: AT_INFO GlobalAtInfo; // at information structure ! 92: BOOL fTimer; // flag for timer events ! 93: DWORD GlobalJobId; // job id as dword ! 94: DWORD dwDisposition; // used for registry calls ! 95: DWORD dwH = DWH; // height of main window ! 96: DWORD dwTime; // time in milliseconds ! 97: DWORD dwW = DWW; // width of main window ! 98: DWORD dwX = DWX; // x location of main window ! 99: DWORD dwY = DWY; // y location of main window ! 100: FARPROC lpAmPmProc; // subclass for add/change AmPm edit control ! 101: FARPROC lpAmPmDefProc; // default handler for add/change AmPm edit control ! 102: FARPROC lpDownButtonProc; // subclass for spin button ! 103: FARPROC lpDownButtonDefProc; // default handler for spin buttons ! 104: FARPROC lpHourProc; // subclass for add/change hour edit control ! 105: FARPROC lpHourDefProc; // default handler for add/change hour edit control ! 106: FARPROC lpMinProc; // subclass for add/change min edit control ! 107: FARPROC lpMinDefProc; // default handler for add/change min edit control ! 108: FARPROC lpUpButtonProc; // subclass for spin button ! 109: FARPROC lpUpButtonDefProc; // default handler for spin buttons ! 110: HANDLE hInst; // instance ! 111: HCURSOR hCursorOld; // old cursor ! 112: HCURSOR hCursorWait; // hourglass cursor ! 113: HFONT hFont; // handle to font ! 114: HANDLE GlobalMessageHandle; // handle to netmsg.dll ! 115: HKEY hkHandle; // hangle to registry ! 116: HWND hCurrentFocus = NULL; // handle to window with focus (used for hour/min/ampm spin buttons) ! 117: HWND hGlobalhWnd; // handle to main window ! 118: HWND hGlobalAddChg = NULL; // handle to Add/Change dialog when active ! 119: HWND hHour = NULL; // handle to hour ! 120: HWND hMin = NULL; // handle to minutes ! 121: HWND hAmPm = NULL; // handle to ampm ! 122: LOGFONT lf; // font ! 123: PWSTR GlobalComputerName; // currently selected comp. name ! 124: UCHAR szRegistryPath[] = SZREGPATH; // path to registry for stored info ! 125: UCHAR szAppName[] = SZAPPTITLE; // name of this application ! 126: UCHAR szAtCommand[MAX_ATCMD_LEN+1]; // entire line in atcommand listbox ! 127: UCHAR szCommandM[MAXCOMMANDLEN+1]; // multibyte command ! 128: UCHAR szComputerM[MAXCOMPUTERNAMELEN+1]; // multibyte comp. name ! 129: UCHAR szDateAbbr[4]; // store day of month as string ! 130: UCHAR szDayAbbr[7][4] = // abbreviations ! 131: { ! 132: "M ", "T ", "W ", "Th ", "F ", "Sa ", "Su " ! 133: }; ! 134: UCHAR szDefault[] = " "; // default char for wide conversion ! 135: UCHAR szError[] = SZGENERROR; // error message ! 136: UCHAR szNoEntries[] = SZNOENTRIES; // error message ! 137: UCHAR szTime[8]; // store time as string ! 138: UCHAR szTitle[] = SZAPPTITLE; // title bar text ! 139: UCHAR szWhenDay[MAXWHENDAYLEN + 1]; // used to build when/day string ! 140: UINT uAmPmChars; // count of characters in add/change AmPm edit control ! 141: UINT uHourChars; // count of characters in add/change hour edit control ! 142: UINT uMinChars; // count of characters in add/change min edit control ! 143: UINT uTimer; // handle of timer ! 144: WCHAR szCommandW[MAXCOMMANDLEN+1]; // widechar command ! 145: WCHAR szComputerW[MAXCOMPUTERNAMELEN+1]; // widechar comp. name ! 146: ! 147: ! 148: ! 149: //=========================================================================== ! 150: // FUNCTION: AddChangeDlgProc() ! 151: //=========================================================================== ! 152: ! 153: BOOL APIENTRY ! 154: AddChangeDlgProc( ! 155: HWND hWnd, // window handle ! 156: UINT message, // type of message ! 157: UINT uParam, // additional information ! 158: LONG lParam // additional information ! 159: ) ! 160: { ! 161: ! 162: NET_API_STATUS status; ! 163: PAT_INFO pAtInfo = NULL; ! 164: SYSTEMTIME SystemTime; ! 165: UCHAR szAtCommand[MAX_ATCMD_LEN]; ! 166: UCHAR szTemp[30]; ! 167: char * ptr; ! 168: int JobId; ! 169: int i; ! 170: int wmEvent; ! 171: int wmId; ! 172: static BOOL fChange; ! 173: BOOL Translated; ! 174: UINT Value; ! 175: int Delta; ! 176: ! 177: // owner draw stuff ! 178: static LPDRAWITEMSTRUCT lpdis; // Long Pointer to owner-draw struct ! 179: LPMEASUREITEMSTRUCT lpmis; // Long Pointer to o-d measure struct ! 180: static HBITMAP hButtonUpDef, // for button's regular state bm ! 181: hButtonUpDep, // for button's pushed state bm ! 182: hButtonDownDef, // for button's regular state bm ! 183: hButtonDownDep; // for button's pushed state bm ! 184: ! 185: switch (message) { ! 186: ! 187: case WM_SPINBUTTON: ! 188: ! 189: if ( (hCurrentFocus != hHour) && (hCurrentFocus != hMin) && (hCurrentFocus != hAmPm) ) { ! 190: ! 191: break; ! 192: ! 193: } ! 194: ! 195: if ( lParam == UP ) { ! 196: ! 197: Delta = UP; ! 198: ! 199: } else { ! 200: ! 201: Delta = DOWN; ! 202: ! 203: } ! 204: ! 205: if ( uParam == (UINT)GetDlgItem( hWnd, IDC_HOUR ) ) { ! 206: ! 207: Value = GetDlgItemInt( hWnd, IDC_HOUR, &Translated, FALSE ); ! 208: ! 209: if ( Translated == 0 ) { ! 210: ! 211: SetDlgItemInt( hWnd, IDC_HOUR, DEFAULT_HOUR, FALSE ); ! 212: ! 213: } else { ! 214: ! 215: if ( ( Value >= 12 || Value < 1 ) && Delta == UP ) { ! 216: ! 217: Value = 1; ! 218: ! 219: } else if ( ( Value > 12 || Value <= 1 ) && Delta == DOWN ) { ! 220: ! 221: Value = 12; ! 222: ! 223: } else { ! 224: ! 225: if ( (Value == 11 && Delta == UP) || (Value == 12 && Delta == DOWN) ) { ! 226: ! 227: GetDlgItemText( hWnd, IDC_AMPM, (LPTSTR)&szTemp, sizeof(szTemp) ); ! 228: ! 229: if ( szTemp[0] == 'A' || szTemp[0] == 'a' ) { ! 230: ! 231: SetDlgItemText( hWnd, IDC_AMPM, (LPCTSTR)"PM" ); ! 232: ! 233: } else { ! 234: ! 235: SetDlgItemText( hWnd, IDC_AMPM, (LPCTSTR)"AM" ); ! 236: ! 237: } ! 238: } ! 239: ! 240: Value += Delta; ! 241: ! 242: } ! 243: ! 244: SetDlgItemInt( hWnd, IDC_HOUR, Value, FALSE ); ! 245: ! 246: } ! 247: ! 248: SendDlgItemMessage( hWnd, IDC_HOUR, EM_SETSEL, 0, -1 ); ! 249: //SetFocus( (HWND)uParam ); ! 250: ! 251: } else if ( uParam == (UINT)GetDlgItem( hWnd, IDC_MIN ) ) { ! 252: ! 253: Value = GetDlgItemInt( hWnd, IDC_MIN, &Translated, FALSE ); ! 254: ! 255: if ( Translated == 0 ) { ! 256: ! 257: SetDlgItemInt( hWnd, IDC_MIN, DEFAULT_MIN, FALSE ); ! 258: ! 259: } else { ! 260: ! 261: if ( ( Value >= 59 || Value < 0 ) && Delta == UP ) { ! 262: ! 263: Value = 0; ! 264: ! 265: } else if ( ( Value > 59 || Value <= 0 ) && Delta == DOWN ) { ! 266: ! 267: Value = 59; ! 268: ! 269: } else { ! 270: ! 271: Value += Delta; ! 272: ! 273: } ! 274: ! 275: } ! 276: ! 277: if ( Value > 9 ) { ! 278: ! 279: SetDlgItemInt( hWnd, IDC_MIN, Value, FALSE ); ! 280: ! 281: } else { ! 282: ! 283: szTemp[0] = '0'; ! 284: szTemp[1] = '0' + Value; ! 285: szTemp[2] = '\0'; ! 286: ! 287: SetDlgItemText( hWnd, IDC_MIN, szTemp ); ! 288: } ! 289: ! 290: SendDlgItemMessage( hWnd, IDC_MIN, EM_SETSEL, 0, -1 ); ! 291: //SetFocus( (HWND)uParam ); ! 292: ! 293: } else if ( uParam == (UINT)GetDlgItem( hWnd, IDC_AMPM ) ) { ! 294: ! 295: GetDlgItemText( hWnd, IDC_AMPM, (LPTSTR)&szTemp, sizeof(szTemp) ); ! 296: ! 297: if ( szTemp[0] == 'A' || szTemp[0] == 'a' ) { ! 298: ! 299: SetDlgItemText( hWnd, IDC_AMPM, (LPCTSTR)"PM" ); ! 300: ! 301: } else { ! 302: ! 303: SetDlgItemText( hWnd, IDC_AMPM, (LPCTSTR)"AM" ); ! 304: ! 305: } ! 306: ! 307: SendDlgItemMessage( hWnd, IDC_AMPM, EM_SETSEL, 0, -1 ); ! 308: //SetFocus( (HWND)uParam ); ! 309: ! 310: } ! 311: ! 312: break; ! 313: ! 314: case WM_MEASUREITEM: ! 315: ! 316: lpmis = (LPMEASUREITEMSTRUCT)lParam; // for convenience ! 317: lpmis->itemWidth = 7; ! 318: lpmis->itemHeight = 7; ! 319: ! 320: break; ! 321: ! 322: case WM_DRAWITEM: ! 323: ! 324: lpdis = (LPDRAWITEMSTRUCT)lParam; // for convenience ! 325: ! 326: switch (lpdis->itemAction) { ! 327: ! 328: case ODA_DRAWENTIRE: ! 329: if ( lpdis->CtlID == IDD_DOWNBUT ) { ! 330: DrawBitmap(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, hButtonDownDef, SRCCOPY); ! 331: } else { ! 332: DrawBitmap(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, hButtonUpDef, SRCCOPY); ! 333: } ! 334: ! 335: break; ! 336: ! 337: case ODA_SELECT: ! 338: // handle select state -- text is right & down 2 pixels ! 339: // also handle focus state since it's associated ! 340: if (lpdis->itemState & ODS_SELECTED) { ! 341: if ( lpdis->CtlID == IDD_DOWNBUT ) { ! 342: DrawBitmap(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, hButtonDownDep, SRCCOPY); ! 343: } else { ! 344: DrawBitmap(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, hButtonUpDep, SRCCOPY); ! 345: } ! 346: } ! 347: else { ! 348: if ( lpdis->CtlID == IDD_DOWNBUT ) { ! 349: DrawBitmap(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, hButtonDownDef, SRCCOPY); ! 350: } else { ! 351: DrawBitmap(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, hButtonUpDef, SRCCOPY); ! 352: } ! 353: ! 354: if ( hCurrentFocus != NULL ) { ! 355: ! 356: SetFocus( hCurrentFocus ); ! 357: ! 358: } ! 359: ! 360: } ! 361: break; ! 362: ! 363: case ODA_FOCUS: ! 364: if (lpdis->itemState & ODS_FOCUS) { ! 365: ! 366: break; ! 367: } ! 368: ! 369: break; ! 370: ! 371: default: ! 372: ! 373: break; ! 374: ! 375: } //itemAction ! 376: ! 377: break; ! 378: ! 379: case WM_INITDIALOG: ! 380: ! 381: /* load bitmaps and get area of text rectangle for owner-draw button */ ! 382: ! 383: hButtonUpDef = LoadBitmap(hInst,"BUTTONUPDEF"); // regular state ! 384: hButtonUpDep = LoadBitmap(hInst,"BUTTONUPDEP"); // pushed state ! 385: ! 386: ! 387: hButtonDownDef = LoadBitmap(hInst,"BUTTONDOWNDEF"); // regular state ! 388: hButtonDownDep = LoadBitmap(hInst,"BUTTONDOWNDEP"); // pushed state ! 389: ! 390: hCurrentFocus = NULL; ! 391: hHour = GetDlgItem( hWnd, IDC_HOUR ); ! 392: hMin = GetDlgItem( hWnd, IDC_MIN ); ! 393: hAmPm = GetDlgItem( hWnd, IDC_AMPM ); ! 394: ! 395: SendDlgItemMessage( hWnd, IDC_NEWCOMMAND, WM_SETFONT, (WPARAM)hFont, 1L ); ! 396: SendDlgItemMessage( hWnd, IDC_DAYS, WM_SETFONT, (WPARAM)hFont, 1L ); ! 397: SendDlgItemMessage( hWnd, IDC_HOUR, WM_SETFONT, (WPARAM)hFont, 1L ); ! 398: SendDlgItemMessage( hWnd, IDC_MIN, WM_SETFONT, (WPARAM)hFont, 1L ); ! 399: SendDlgItemMessage( hWnd, IDC_AMPM, WM_SETFONT, (WPARAM)hFont, 1L ); ! 400: ! 401: // fill in Days ! 402: SendDlgItemMessage(hWnd, IDC_DAYS, LB_ADDSTRING, 0, (LPARAM)"Monday"); ! 403: SendDlgItemMessage(hWnd, IDC_DAYS, LB_ADDSTRING, 0, (LPARAM)"Tuesday"); ! 404: SendDlgItemMessage(hWnd, IDC_DAYS, LB_ADDSTRING, 0, (LPARAM)"Wednesday"); ! 405: SendDlgItemMessage(hWnd, IDC_DAYS, LB_ADDSTRING, 0, (LPARAM)"Thursday"); ! 406: SendDlgItemMessage(hWnd, IDC_DAYS, LB_ADDSTRING, 0, (LPARAM)"Friday"); ! 407: SendDlgItemMessage(hWnd, IDC_DAYS, LB_ADDSTRING, 0, (LPARAM)"Saturday"); ! 408: SendDlgItemMessage(hWnd, IDC_DAYS, LB_ADDSTRING, 0, (LPARAM)"Sunday"); ! 409: ! 410: for ( i=1; i<=9; ++i ) { ! 411: ! 412: UCHAR szDateAbbr[2]; ! 413: ! 414: szDateAbbr[0] = i + '0'; ! 415: szDateAbbr[1] = '\0'; ! 416: ! 417: SendDlgItemMessage(hWnd, IDC_DAYS, LB_ADDSTRING, 0, (LPARAM)szDateAbbr ); ! 418: ! 419: } ! 420: ! 421: for ( i=10; i<=31; ++i ) { ! 422: ! 423: UCHAR szDateAbbr[3]; ! 424: ! 425: szDateAbbr[0] = i/10 + '0'; ! 426: szDateAbbr[1] = i%10 + '0'; ! 427: szDateAbbr[2] = '\0'; ! 428: ! 429: SendDlgItemMessage(hWnd, IDC_DAYS, LB_ADDSTRING, 0, (LPARAM)szDateAbbr ); ! 430: ! 431: } ! 432: ! 433: if ( lParam == IDC_ADD ) { ! 434: ! 435: SendDlgItemMessage(hWnd, IDC_DAYS, LB_SETCURSEL, 0, 0); ! 436: ! 437: // fill in Time ! 438: ! 439: SetDlgItemInt( hWnd, IDC_HOUR, DEFAULT_HOUR, FALSE ); ! 440: ! 441: if ( DEFAULT_MIN > 9 ) { ! 442: ! 443: SetDlgItemInt( hWnd, IDC_MIN, DEFAULT_MIN, FALSE ); ! 444: ! 445: } else { ! 446: ! 447: szTemp[0] = '0'; ! 448: szTemp[1] = '0' + DEFAULT_MIN; ! 449: szTemp[2] = '\0'; ! 450: ! 451: SetDlgItemText( hWnd, IDC_MIN, szTemp ); ! 452: } ! 453: ! 454: SetDlgItemText( hWnd, IDC_AMPM, (LPCTSTR)DEFAULT_AMPM ); ! 455: ! 456: // set the Every radio button ! 457: ! 458: SendDlgItemMessage(hWnd, IDC_EVERY, BM_SETCHECK, TRUE, 0); ! 459: ! 460: fChange = FALSE; ! 461: ! 462: lstrcpy( szTemp, "Add Command" ); ! 463: ! 464: SetWindowText( hWnd, szTemp ); ! 465: ! 466: } else { ! 467: ! 468: fChange = TRUE; ! 469: ! 470: lstrcpy( szTemp, "Change Command" ); ! 471: ! 472: SetWindowText( hWnd, szTemp ); ! 473: ! 474: // fill in current command info ! 475: ! 476: SendDlgItemMessage( ! 477: hGlobalhWnd, ! 478: IDC_ATCOMMANDS, ! 479: LB_GETTEXT, ! 480: SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_GETCURSEL, 0, 0 ), ! 481: (LPARAM)szAtCommand ! 482: ); ! 483: ! 484: // get job id ! 485: ! 486: JobId = 0; ! 487: ! 488: ptr = szAtCommand; ! 489: ! 490: while( *ptr >= '0' && *ptr <= '9' ) { ! 491: ! 492: JobId *= 10; ! 493: JobId += (UINT)*ptr - '0'; ! 494: ! 495: ptr++; ! 496: ! 497: } ! 498: ! 499: // get info on this job ! 500: ! 501: status = NetScheduleJobGetInfo( ! 502: GlobalComputerName, ! 503: JobId, ! 504: (LPBYTE *)&pAtInfo ! 505: ); ! 506: ! 507: if ( status != NERR_Success ) { ! 508: ! 509: //MessageBox( hWnd, "Problem getting Job Info.", SZWINDOWTITLE, MB_OK | MB_ICONEXCLAMATION ); ! 510: ! 511: MessagePrint( status ); ! 512: ! 513: EndDialog( hWnd, 0 ); ! 514: ! 515: } ! 516: ! 517: // fill in command ! 518: ! 519: WideCharToMultiByte( ! 520: (UINT)CP_ACP, ! 521: (DWORD)0, ! 522: (LPWSTR)pAtInfo->Command, ! 523: MAX_ATCMD_LEN, ! 524: (LPSTR)szCommandM, ! 525: MAX_ATCMD_LEN, ! 526: (LPSTR)NULL, (LPBOOL)NULL ! 527: ); ! 528: ! 529: SetDlgItemText( hWnd, IDC_NEWCOMMAND, szCommandM ); ! 530: ! 531: // set days this command runs ! 532: ! 533: if ( pAtInfo->DaysOfWeek != 0) { ! 534: ! 535: for ( i=0; i<7; ++i ) { ! 536: ! 537: if ( ( pAtInfo->DaysOfWeek & (1 << i) ) != 0 ) { ! 538: ! 539: SendDlgItemMessage( hWnd, IDC_DAYS, LB_SETSEL, TRUE, i ); ! 540: ! 541: } ! 542: ! 543: } ! 544: ! 545: } ! 546: ! 547: if ( pAtInfo->DaysOfMonth != 0) { ! 548: ! 549: for ( i=0; i<31; ++i ) { ! 550: ! 551: if ( ( pAtInfo->DaysOfMonth & (1L << i) ) != 0 ) { ! 552: ! 553: SendDlgItemMessage( hWnd, IDC_DAYS, LB_SETSEL, TRUE, i+7 ); ! 554: ! 555: } ! 556: ! 557: } ! 558: ! 559: } ! 560: ! 561: // fill in every/today/tomorrow/next flag ! 562: ! 563: if ( pAtInfo->Flags & JOB_RUN_PERIODICALLY ) { ! 564: ! 565: SendDlgItemMessage( hWnd, IDC_EVERY, BM_SETCHECK, TRUE, 0 ); ! 566: ! 567: SendMessage( hWnd, WM_COMMAND, IDC_EVERY, 0 ); ! 568: ! 569: } else if ( (pAtInfo->DaysOfWeek != 0) || (pAtInfo->DaysOfMonth != 0) ) { ! 570: ! 571: SendDlgItemMessage( hWnd, IDC_NEXT, BM_SETCHECK, TRUE, 0 ); ! 572: ! 573: SendMessage( hWnd, WM_COMMAND, IDC_NEXT, 0 ); ! 574: ! 575: } else if ( pAtInfo->Flags & JOB_RUNS_TODAY ) { ! 576: ! 577: SendDlgItemMessage( hWnd, IDC_TODAY, BM_SETCHECK, TRUE, 0 ); ! 578: ! 579: SendMessage( hWnd, WM_COMMAND, IDC_TODAY, 0 ); ! 580: ! 581: } else { ! 582: ! 583: SendDlgItemMessage( hWnd, IDC_TOMORROW, BM_SETCHECK, TRUE, 0 ); ! 584: ! 585: SendMessage( hWnd, WM_COMMAND, IDC_TOMORROW, 0 ); ! 586: ! 587: } ! 588: ! 589: // set time for this command ! 590: ! 591: { ! 592: ! 593: UINT uJobTime = (UINT)(pAtInfo->JobTime / 1000 / 60 / 60); ! 594: UINT uAM = TRUE; ! 595: ! 596: if ( uJobTime == 0 ) { ! 597: ! 598: uJobTime = 12; ! 599: ! 600: } else if ( uJobTime == 12 ) { ! 601: ! 602: uAM = FALSE; ! 603: ! 604: } else if ( uJobTime > 12 ) { ! 605: ! 606: uJobTime -= 12; ! 607: ! 608: uAM = FALSE; ! 609: ! 610: } ! 611: ! 612: SetDlgItemInt( hWnd, IDC_HOUR, uJobTime, FALSE ); ! 613: ! 614: uAM ? SetDlgItemText( hWnd, IDC_AMPM, "AM" ) : SetDlgItemText( hWnd, IDC_AMPM, "PM" ); ! 615: ! 616: if ( (UINT)(pAtInfo->JobTime / 1000 / 60 % 60) > 9 ) { ! 617: ! 618: SetDlgItemInt( hWnd, IDC_MIN, (UINT)(pAtInfo->JobTime / 1000 / 60 % 60), FALSE ); ! 619: ! 620: } else { ! 621: ! 622: szTemp[0] = '0'; ! 623: szTemp[1] = '0' + (UINT)(pAtInfo->JobTime / 1000 / 60 % 60); ! 624: szTemp[2] = '\0'; ! 625: ! 626: SetDlgItemText( hWnd, IDC_MIN, szTemp ); ! 627: } ! 628: ! 629: } ! 630: ! 631: // free buffer ! 632: ! 633: NetApiBufferFree( (LPVOID)pAtInfo ); ! 634: ! 635: } ! 636: ! 637: // set up subclass functions ! 638: ! 639: lpAmPmProc = MakeProcInstance( (FARPROC)AmPmProc, hInst ); ! 640: lpAmPmDefProc = (FARPROC) SetWindowLong( GetDlgItem( hWnd, IDC_AMPM ), GWL_WNDPROC, (LONG)lpAmPmProc ); ! 641: lpDownButtonProc = MakeProcInstance( (FARPROC)DownButtonProc, hInst ); ! 642: lpDownButtonDefProc = (FARPROC) SetWindowLong( GetDlgItem( hWnd, IDD_DOWNBUT ), GWL_WNDPROC, (LONG)lpDownButtonProc ); ! 643: lpUpButtonProc = MakeProcInstance( (FARPROC)UpButtonProc, hInst ); ! 644: lpUpButtonDefProc = (FARPROC) SetWindowLong( GetDlgItem( hWnd, IDD_UPBUT ), GWL_WNDPROC, (LONG)lpUpButtonProc ); ! 645: lpHourProc = MakeProcInstance( (FARPROC)HourProc, hInst ); ! 646: lpHourDefProc = (FARPROC) SetWindowLong( GetDlgItem( hWnd, IDC_HOUR ), GWL_WNDPROC, (LONG)lpHourProc ); ! 647: lpMinProc = MakeProcInstance( (FARPROC)MinProc, hInst ); ! 648: lpMinDefProc = (FARPROC) SetWindowLong( GetDlgItem( hWnd, IDC_MIN ), GWL_WNDPROC, (LONG)lpMinProc ); ! 649: ! 650: // will default to two chars ! 651: ! 652: uHourChars = 2; ! 653: uMinChars = 2; ! 654: ! 655: ! 656: hGlobalAddChg = hWnd; ! 657: ! 658: break; ! 659: ! 660: case WM_COMMAND: // message: command from application menu ! 661: ! 662: wmId = LOWORD(uParam); ! 663: wmEvent = HIWORD(uParam); ! 664: ! 665: switch (wmId) { ! 666: ! 667: case IDC_TODAY: ! 668: case IDC_TOMORROW: ! 669: ! 670: GetLocalTime( &SystemTime ); ! 671: ! 672: if ( SystemTime.wDayOfWeek == 0 ) { ! 673: ! 674: SystemTime.wDayOfWeek = 7; ! 675: ! 676: } ! 677: ! 678: for( i=0; i<NUMDAYITEMS; ++i ) { ! 679: ! 680: SendDlgItemMessage( hWnd, IDC_DAYS, LB_SETSEL, FALSE, i ); ! 681: ! 682: } ! 683: ! 684: SendDlgItemMessage( ! 685: hWnd, ! 686: IDC_DAYS, ! 687: LB_SETSEL, ! 688: TRUE, ! 689: wmId == IDC_TOMORROW ? SystemTime.wDayOfWeek : SystemTime.wDayOfWeek - 1 ); ! 690: ! 691: EnableWindow(GetDlgItem(hWnd, IDC_DAYS), FALSE); ! 692: ! 693: break; ! 694: ! 695: case IDC_EVERY: ! 696: ! 697: EnableWindow(GetDlgItem(hWnd, IDC_DAYS), TRUE); ! 698: ! 699: break; ! 700: ! 701: case IDC_NEXT: ! 702: ! 703: EnableWindow(GetDlgItem(hWnd, IDC_DAYS), TRUE); ! 704: ! 705: break; ! 706: ! 707: case IDCANCEL: ! 708: ! 709: hCurrentFocus = NULL; ! 710: DeleteObject( hButtonUpDef ); ! 711: DeleteObject( hButtonUpDep ); ! 712: DeleteObject( hButtonDownDep ); ! 713: DeleteObject( hButtonDownDef ); ! 714: ! 715: EndDialog( hWnd, IDCANCEL ); ! 716: ! 717: break; ! 718: ! 719: case IDOK: ! 720: ! 721: if ( ValidateAddChangeArguments( hWnd ) == TRUE ) { ! 722: ! 723: if( fChange == TRUE) { ! 724: ! 725: status = JobDel( DEL_ID_CHANGE, hGlobalhWnd); ! 726: ! 727: } ! 728: ! 729: status = JobAdd(); ! 730: ! 731: if ( status == NERR_Success ) { ! 732: ! 733: SendMessage( hWnd, WM_COMMAND, IDC_REFRESH, (LPARAM)SCS_BOTTOM ); ! 734: ! 735: hCurrentFocus = NULL; ! 736: DeleteObject( hButtonUpDef ); ! 737: DeleteObject( hButtonUpDep ); ! 738: DeleteObject( hButtonDownDep ); ! 739: DeleteObject( hButtonDownDef ); ! 740: ! 741: EndDialog( hWnd, IDOK ); ! 742: ! 743: } else { ! 744: ! 745: //MessageBox( hWnd, "Problem adding command.", SZWINDOWTITLE, MB_OK | MB_ICONEXCLAMATION ); ! 746: ! 747: MessagePrint( status ); ! 748: ! 749: } ! 750: ! 751: } ! 752: ! 753: break; ! 754: ! 755: case IDC_ADDCHANGEHELP: ! 756: ! 757: if (!WinHelp (hWnd, "WINAT.HLP", HELP_KEY,(DWORD)(LPSTR)"CONTENTS")) { ! 758: MessageBox (GetFocus(), ! 759: "Unable to activate help", ! 760: SZWINDOWTITLE, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); ! 761: } ! 762: ! 763: break; ! 764: ! 765: } ! 766: ! 767: break; ! 768: ! 769: } ! 770: ! 771: return (0); ! 772: ! 773: } ! 774: ! 775: ! 776: ! 777: //=========================================================================== ! 778: // FUNCTION: AmPmProc() ! 779: //=========================================================================== ! 780: LRESULT APIENTRY AmPmProc( HWND hWnd, UINT message, UINT uParam, LONG lParam ) ! 781: { ! 782: UCHAR szCurVal[3]; ! 783: ! 784: switch ( message ) { ! 785: ! 786: case WM_COPY: ! 787: case WM_PASTE: ! 788: case WM_CUT: ! 789: ! 790: // cut and paste dont seem to work... ! 791: ! 792: break; ! 793: ! 794: case WM_CHAR: ! 795: ! 796: if ( uParam == VK_BACK ) { ! 797: ! 798: if ( uAmPmChars > 0 ) { ! 799: ! 800: --uAmPmChars; ! 801: ! 802: } ! 803: ! 804: return CallWindowProc( (WNDPROC)lpAmPmDefProc, hWnd, message, uParam, lParam ) ; ! 805: ! 806: } else { ! 807: ! 808: uAmPmChars = (UINT) SendMessage( hWnd, WM_GETTEXT, 2, (LPARAM)szCurVal ); ! 809: ! 810: if ( uAmPmChars == 0 ) { ! 811: ! 812: switch( uParam ) { ! 813: ! 814: case 'a': ! 815: case 'A': ! 816: ! 817: szCurVal[0] = 'A'; ! 818: ! 819: break; ! 820: ! 821: case 'p': ! 822: case 'P': ! 823: ! 824: szCurVal[0] = 'P'; ! 825: ! 826: break; ! 827: ! 828: default: ! 829: ! 830: MessageBeep( MB_OK ); ! 831: ! 832: return( 0 ); ! 833: ! 834: } ! 835: ! 836: szCurVal[1] = 'M'; ! 837: szCurVal[2] = '\0'; ! 838: uAmPmChars = 2; ! 839: ! 840: SendMessage( hWnd, WM_SETTEXT, 0, (LPARAM)szCurVal ); ! 841: ! 842: return( 0 ); ! 843: ! 844: } else if ( uAmPmChars == 1 ) { ! 845: ! 846: if ( (szCurVal[0] != 'a' && szCurVal[0] != 'A' && ! 847: szCurVal[0] != 'p' && szCurVal[0] != 'P' ) || ! 848: (uParam != 'm' && uParam != 'M') ) { ! 849: ! 850: MessageBeep( MB_OK ); ! 851: ! 852: return( 0 ); ! 853: ! 854: } ! 855: ! 856: } else if ( uAmPmChars == 2 ) { ! 857: ! 858: if ( (szCurVal[0] != 'a' && szCurVal[0] != 'A' && ! 859: szCurVal[0] != 'p' && szCurVal[0] != 'P' ) ) { ! 860: ! 861: MessageBeep( MB_OK ); ! 862: ! 863: SendMessage( hWnd, WM_SETTEXT, 0, (LPARAM)"" ); ! 864: ! 865: return( 0 ); ! 866: ! 867: } else if ( szCurVal[1] != 'm' && szCurVal[1] != 'M' ) { ! 868: ! 869: szCurVal[1] = '\0'; ! 870: ! 871: MessageBeep( MB_OK ); ! 872: ! 873: SendMessage( hWnd, WM_SETTEXT, 0, (LPARAM)szCurVal ); ! 874: ! 875: return( 0 ); ! 876: ! 877: } ! 878: ! 879: } else if ( uAmPmChars > 2 ) { ! 880: ! 881: uAmPmChars = 0; ! 882: ! 883: MessageBeep( MB_OK ); ! 884: ! 885: SendMessage( hWnd, WM_SETTEXT, 0, (LPARAM)"" ); ! 886: ! 887: return( 0 ); ! 888: ! 889: } ! 890: ! 891: } ! 892: ! 893: break; ! 894: ! 895: } // switch ! 896: ! 897: return CallWindowProc( (WNDPROC)lpAmPmDefProc, hWnd, message, uParam, lParam ) ; ! 898: ! 899: } ! 900: ! 901: ! 902: ! 903: //=========================================================================== ! 904: // FUNCTION: AreYouSure() ! 905: // ! 906: // Arguments: ! 907: // ! 908: // Uses globals. ! 909: // ! 910: // Return Value: ! 911: // ! 912: // ID_YES if the yes button pressed ! 913: // ID_NO if the no button pressed ! 914: // ! 915: //=========================================================================== ! 916: UINT ! 917: AreYouSure( ! 918: HWND hWnd ! 919: ) ! 920: { ! 921: ! 922: return ( MessageBox( ! 923: hWnd, ! 924: "Remove the selected command?", ! 925: "Confirm Remove", ! 926: MB_YESNO | MB_ICONEXCLAMATION ! 927: ) ! 928: ); ! 929: ! 930: } ! 931: ! 932: ! 933: ! 934: //=========================================================================== ! 935: // FUNCTION: DownButtonProc() ! 936: //=========================================================================== ! 937: LRESULT APIENTRY DownButtonProc( HWND hWnd, UINT message, UINT uParam, LONG lParam ) ! 938: { ! 939: ! 940: switch ( message ) { ! 941: ! 942: case WM_SETFOCUS: ! 943: ! 944: if ( (uParam == (UINT)hHour) || (uParam == (UINT)hMin) || (uParam == (UINT)hAmPm) ) { ! 945: ! 946: hCurrentFocus = (HWND)uParam; ! 947: ! 948: PostMessage( hGlobalAddChg, WM_SPINBUTTON, uParam, (LONG)DOWN ); ! 949: ! 950: } else { ! 951: ! 952: hCurrentFocus = (HWND)uParam; ! 953: ! 954: } ! 955: ! 956: break; ! 957: ! 958: } // switch ! 959: ! 960: return CallWindowProc( (WNDPROC)lpDownButtonDefProc, hWnd, message, uParam, lParam ) ; ! 961: ! 962: } ! 963: ! 964: ! 965: ! 966: /**************************************************************************** ! 967: ! 968: FUNCTION: DrawBitmap ! 969: ! 970: PURPOSE: Draw default or pushed button bitmap ! 971: ! 972: ****************************************************************************/ ! 973: ! 974: void DrawBitmap( ! 975: HDC hDC, ! 976: LONG xStart, ! 977: LONG yStart, ! 978: HBITMAP hBitmap, ! 979: DWORD rop) ! 980: { ! 981: BITMAP bm; ! 982: HDC hMemDC; ! 983: POINT pt; ! 984: ! 985: hMemDC = CreateCompatibleDC (hDC); ! 986: SelectObject (hMemDC, hBitmap); ! 987: GetObject (hBitmap, sizeof (BITMAP), (LPSTR) &bm); ! 988: pt.x = bm.bmWidth; ! 989: pt.y = bm.bmHeight; ! 990: BitBlt (hDC, xStart, yStart, pt.x, pt.y, hMemDC, 0, 0, rop); ! 991: DeleteDC (hMemDC); ! 992: } ! 993: ! 994: ! 995: ! 996: //=========================================================================== ! 997: // FUNCTION: HourProc() ! 998: //=========================================================================== ! 999: LRESULT APIENTRY HourProc( HWND hWnd, UINT message, UINT uParam, LONG lParam ) ! 1000: { ! 1001: UINT uCurVal; ! 1002: UCHAR szCurVal[3]; ! 1003: ! 1004: switch ( message ) { ! 1005: ! 1006: case WM_COPY: ! 1007: case WM_PASTE: ! 1008: case WM_CUT: ! 1009: ! 1010: // cut and paste dont seem to work... ! 1011: ! 1012: break; ! 1013: ! 1014: case WM_CHAR: ! 1015: ! 1016: if ( uParam == VK_BACK ) { ! 1017: ! 1018: if ( uHourChars > 0 ) { ! 1019: ! 1020: --uHourChars; ! 1021: ! 1022: } ! 1023: ! 1024: return CallWindowProc( (WNDPROC)lpHourDefProc, hWnd, message, uParam, lParam ) ; ! 1025: ! 1026: } else { ! 1027: ! 1028: uHourChars = (UINT) SendMessage( hWnd, WM_GETTEXT, 2, (LPARAM)szCurVal ); ! 1029: ! 1030: if ( uHourChars == 0 ) { ! 1031: ! 1032: uCurVal = 0; ! 1033: ! 1034: } else if ( uHourChars == 1 ) { ! 1035: ! 1036: uCurVal = szCurVal[0] - '0'; ! 1037: ! 1038: } else if ( uHourChars == 2 ) { ! 1039: ! 1040: uCurVal = szCurVal[0] - '0'; ! 1041: uCurVal *= 10; ! 1042: uCurVal = szCurVal[1] - '0'; ! 1043: ! 1044: } else if ( uHourChars > 2 ) { ! 1045: ! 1046: uHourChars = 0; ! 1047: ! 1048: SendMessage( hWnd, WM_SETTEXT, 0, (LPARAM)"" ); ! 1049: ! 1050: return( 0 ); ! 1051: ! 1052: } ! 1053: ! 1054: } ! 1055: ! 1056: if ( ( uParam == ' ' ) || // space ! 1057: ( uParam < '0' || uParam > '9') || // not a number ! 1058: ( uParam == '0' && uCurVal == 0 ) || // trying to enter 0 as first char ! 1059: ( (uParam > '2' && uCurVal >= 1) && uHourChars >= 1) || // greater than 12 ! 1060: ( uParam <= '2' && uCurVal > 1) // greater than 12 ! 1061: ) { ! 1062: ! 1063: MessageBeep( MB_OK ); ! 1064: ! 1065: return( 0 ); ! 1066: ! 1067: } else if ( uHourChars < 2 ) { ! 1068: ! 1069: ++uHourChars; ! 1070: ! 1071: } else { ! 1072: ! 1073: MessageBeep( MB_OK ); ! 1074: ! 1075: return( 0 ); ! 1076: ! 1077: } ! 1078: ! 1079: break; ! 1080: ! 1081: } // switch ! 1082: ! 1083: return CallWindowProc( (WNDPROC)lpHourDefProc, hWnd, message, uParam, lParam ) ; ! 1084: ! 1085: } ! 1086: ! 1087: ! 1088: ! 1089: //=========================================================================== ! 1090: // FUNCTION: JobAdd() ! 1091: // ! 1092: // Routine Description: ! 1093: // ! 1094: // Adds a new item to schedule. ! 1095: // ! 1096: // Arguments: ! 1097: // ! 1098: // None. Uses globals. ! 1099: // ! 1100: // Return Value: ! 1101: // ! 1102: // NET_API_STATUS return value of remote api call ! 1103: // ! 1104: //=========================================================================== ! 1105: NET_API_STATUS ! 1106: JobAdd( ! 1107: VOID ! 1108: ) ! 1109: { ! 1110: ! 1111: NET_API_STATUS status; ! 1112: ! 1113: status = NetScheduleJobAdd( ! 1114: GlobalComputerName, ! 1115: (LPBYTE)&GlobalAtInfo, ! 1116: &GlobalJobId ! 1117: ); ! 1118: ! 1119: if ( status != NERR_Success ) { ! 1120: ! 1121: /*MessageBox( ! 1122: hGlobalhWnd, ! 1123: ( status == NERR_ServiceNotInstalled ? "The service has not been started" : "Message could not be added." ), ! 1124: SZWINDOWTITLE, ! 1125: MB_OK | MB_ICONEXCLAMATION ! 1126: ); ! 1127: */ ! 1128: ! 1129: MessagePrint( status ); ! 1130: } ! 1131: ! 1132: return ( status ); ! 1133: ! 1134: } ! 1135: ! 1136: ! 1137: ! 1138: //=========================================================================== ! 1139: // ! 1140: // FUNCTION: JobDel() ! 1141: // ! 1142: // ! 1143: // Routine Description: ! 1144: // ! 1145: // This does all of the processing necessary to dump out the entire ! 1146: // schedule file. It loops through on each record and formats its ! 1147: // information for printing and then goes to the next. ! 1148: // ! 1149: // Arguments: ! 1150: // ! 1151: // DEL_ALL if to delete all jobs, DEL_ID otherwise. ! 1152: // Uses globals. ! 1153: // ! 1154: // Return Value: ! 1155: // ! 1156: // ERROR_SUCCESS if everything enumerated OK ! 1157: // error returned by remote api otherwise ! 1158: // ! 1159: //=========================================================================== ! 1160: NET_API_STATUS ! 1161: JobDel( ! 1162: UINT Method, ! 1163: HWND hWnd ! 1164: ) ! 1165: { ! 1166: ! 1167: DWORD dwSelection; ! 1168: NET_API_STATUS status; ! 1169: UCHAR szAtCommand[MAX_ATCMD_LEN]; ! 1170: UINT JobId; ! 1171: UINT uSelection; ! 1172: UINT uCount; ! 1173: char * ptr; ! 1174: ! 1175: ! 1176: if ( Method != DEL_ID_CHANGE ) { ! 1177: ! 1178: if ( AreYouSure(hWnd) == IDNO ) { ! 1179: ! 1180: return( ERROR_SUCCESS ); ! 1181: ! 1182: } ! 1183: ! 1184: } ! 1185: ! 1186: switch( Method ) { ! 1187: ! 1188: case DEL_ALL: ! 1189: ! 1190: status = NetScheduleJobDel( ! 1191: GlobalComputerName, ! 1192: 0, ! 1193: (DWORD)-1 ! 1194: ); ! 1195: ! 1196: if ( status == NERR_Success ) { ! 1197: ! 1198: SendMessage( hWnd, WM_COMMAND, IDC_REFRESH, (LPARAM)SCS_NONE ); ! 1199: break; ! 1200: ! 1201: } ! 1202: ! 1203: break; ! 1204: ! 1205: case DEL_ID: ! 1206: case DEL_ID_CHANGE: ! 1207: ! 1208: // compute id ! 1209: ! 1210: uSelection = SendDlgItemMessage( hWnd, IDC_ATCOMMANDS, LB_GETCURSEL, 0, 0 ); ! 1211: uCount = SendDlgItemMessage( hWnd, IDC_ATCOMMANDS, LB_GETCOUNT, 0, 0 ); ! 1212: ! 1213: SendDlgItemMessage( ! 1214: hWnd, ! 1215: IDC_ATCOMMANDS, ! 1216: LB_GETTEXT, ! 1217: uSelection, ! 1218: (LPARAM)szAtCommand ! 1219: ); ! 1220: ! 1221: JobId = 0; ! 1222: ptr = szAtCommand; ! 1223: ! 1224: while( *ptr >= '0' && *ptr <= '9' ) { ! 1225: ! 1226: JobId *= 10; ! 1227: JobId += (UINT)*ptr - '0'; ! 1228: ! 1229: ptr++; ! 1230: ! 1231: } ! 1232: ! 1233: status = NetScheduleJobDel( ! 1234: GlobalComputerName, ! 1235: JobId, ! 1236: JobId ! 1237: ); ! 1238: ! 1239: if ( status != NERR_Success) { ! 1240: ! 1241: //MessageBox( hWnd, "Problem deleteing a job.", SZWINDOWTITLE, MB_OK | MB_ICONEXCLAMATION ); ! 1242: ! 1243: MessagePrint( status ); ! 1244: ! 1245: break; ! 1246: ! 1247: } ! 1248: ! 1249: if ( uCount == 1 ) { ! 1250: ! 1251: // this was the only job ! 1252: ! 1253: SendMessage( hWnd, WM_COMMAND, IDC_REFRESH, (LPARAM)SCS_NONE ); ! 1254: ! 1255: } else if ( uSelection == 0 ) { ! 1256: ! 1257: // the first/top job was selected and there is more than 1 job ! 1258: ! 1259: SendMessage( hWnd, WM_COMMAND, IDC_REFRESH, (LPARAM)SCS_TOP ); ! 1260: ! 1261: } else if ( ( uCount - 1 ) == uSelection ) { ! 1262: ! 1263: // the last/bottom job was selected ! 1264: ! 1265: SendMessage( hWnd, WM_COMMAND, IDC_REFRESH, (LPARAM)SCS_BOTTOM ); ! 1266: ! 1267: } else { ! 1268: ! 1269: // the 2nd thru last-1 job was selected ! 1270: ! 1271: dwSelection = 0; ! 1272: dwSelection |= uSelection << 16; ! 1273: dwSelection |= SCS_SELINHIGHWORD; ! 1274: ! 1275: SendMessage( hWnd, WM_COMMAND, IDC_REFRESH, (LPARAM)dwSelection ); ! 1276: ! 1277: } ! 1278: ! 1279: break; ! 1280: ! 1281: } ! 1282: ! 1283: return( status ); ! 1284: ! 1285: } ! 1286: ! 1287: ! 1288: ! 1289: //=========================================================================== ! 1290: // ! 1291: // FUNCTION: JobEnum() ! 1292: // ! 1293: // ! 1294: // Routine Description: ! 1295: // ! 1296: // This does all of the processing necessary to dump out the entire ! 1297: // schedule file. It loops through on each record and formats its ! 1298: // information for printing and then goes to the next. ! 1299: // ! 1300: // Arguments: ! 1301: // ! 1302: // None. Uses globals. ! 1303: // ! 1304: // Return Value: ! 1305: // ! 1306: // ERROR_SUCCESS if everything enumerated OK ! 1307: // error returned by remote api otherwise ! 1308: // ! 1309: //=========================================================================== ! 1310: NET_API_STATUS ! 1311: JobEnum( ! 1312: DWORD SetCurrentSelection ! 1313: ) ! 1314: { ! 1315: ! 1316: BOOL fFlag; ! 1317: BOOL first = TRUE; ! 1318: DWORD EntriesRead; ! 1319: DWORD ResumeJobId = 0; ! 1320: DWORD TotalEntries; ! 1321: LPVOID EnumBuffer = NULL; ! 1322: NET_API_STATUS status = NERR_Success; ! 1323: PAT_ENUM pAtEnum; ! 1324: //UCHAR szTemp[80]; ! 1325: static UINT uSelection; ! 1326: static UINT uTopIndex; ! 1327: int i; ! 1328: ! 1329: // initialize to current selection ! 1330: ! 1331: uSelection = SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_GETCURSEL, 0, 0 ); ! 1332: uTopIndex = SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_GETTOPINDEX, 0, 0 ); ! 1333: ! 1334: if ( uSelection == LB_ERR ) { ! 1335: ! 1336: uSelection = 0; ! 1337: ! 1338: } ! 1339: ! 1340: for ( ; ;) { ! 1341: ! 1342: status = NetScheduleJobEnum( ! 1343: GlobalComputerName, ! 1344: (LPBYTE *)&EnumBuffer, ! 1345: (DWORD)-1, ! 1346: &EntriesRead, ! 1347: &TotalEntries, ! 1348: &ResumeJobId ! 1349: ); ! 1350: ! 1351: if ( status != ERROR_SUCCESS && status != ERROR_MORE_DATA) { ! 1352: ! 1353: // ! 1354: // not needded since both the if/else(MessagePrint) will set this text now ! 1355: // ! 1356: //SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_RESETCONTENT, 0, 0 ); ! 1357: // ! 1358: //SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_ADDSTRING, 0, (LPARAM)szError ); ! 1359: ! 1360: EnableWindow( GetDlgItem( hGlobalhWnd, IDC_ADD ), FALSE ); ! 1361: EnableWindow( GetDlgItem( hGlobalhWnd, IDC_CHANGE ), FALSE ); ! 1362: EnableWindow( GetDlgItem( hGlobalhWnd, IDC_REMOVE ), FALSE ); ! 1363: ! 1364: if ( status == NERR_ServiceNotInstalled ) { ! 1365: ! 1366: SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_RESETCONTENT, 0, 0 ); ! 1367: ! 1368: SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_ADDSTRING, 0, (LPARAM)"Schedule service not started." ); ! 1369: ! 1370: if ( ServiceNotStartedHandler() == FALSE ) { ! 1371: ! 1372: return( status ); ! 1373: ! 1374: } else { ! 1375: ! 1376: continue; ! 1377: ! 1378: } ! 1379: ! 1380: } else { ! 1381: ! 1382: /*wsprintf( szTemp, "The computer %s cannot be found.\nError %u.", &szComputerM[2], status ); ! 1383: ! 1384: MessageBox( ! 1385: hGlobalhWnd, ! 1386: szTemp, ! 1387: SZWINDOWTITLE, ! 1388: MB_OK | MB_ICONEXCLAMATION ! 1389: ); ! 1390: */ ! 1391: ! 1392: MessagePrint( status ); ! 1393: ! 1394: return( status ); ! 1395: ! 1396: } ! 1397: ! 1398: } ! 1399: ! 1400: assert( status == ERROR_SUCCESS ? TotalEntries == EntriesRead : TotalEntries > EntriesRead ); ! 1401: ! 1402: if ( TotalEntries == 0) { ! 1403: ! 1404: break; // no items found ! 1405: ! 1406: } ! 1407: ! 1408: if ( first == TRUE) { ! 1409: ! 1410: ResetListboxExtents( GetDlgItem( hGlobalhWnd, IDC_ATCOMMANDS ) ); ! 1411: SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_RESETCONTENT, 0, 0 ); ! 1412: ! 1413: first = FALSE; ! 1414: ! 1415: } ! 1416: ! 1417: for ( pAtEnum = EnumBuffer; EntriesRead-- > 0; pAtEnum++) { ! 1418: ! 1419: // not sure what this is doing... ! 1420: ! 1421: /* ! 1422: if ( pAtEnum->Flags & JOB_EXEC_ERROR) { ! 1423: ! 1424: if ( MessageGet( APE2_GEN_ERROR, &smallBuffer, 0 ) == 0) { ! 1425: ! 1426: // error reported already ! 1427: exit( -1); ! 1428: ! 1429: } ! 1430: ! 1431: printf( DUMP_FMT1, smallBuffer ); ! 1432: LocalFree( smallBuffer ); ! 1433: ! 1434: } else { ! 1435: ! 1436: printf( DUMP_FMT1, L""); ! 1437: ! 1438: } ! 1439: */ ! 1440: ! 1441: // replate with... ! 1442: ! 1443: if ( pAtEnum->Flags & JOB_EXEC_ERROR) { ! 1444: ! 1445: MessagePrint( APE2_GEN_ERROR ); ! 1446: ! 1447: } ! 1448: ! 1449: szWhenDay[0] = '\0'; ! 1450: ! 1451: if ( pAtEnum->Flags & JOB_RUN_PERIODICALLY ) { ! 1452: ! 1453: lstrcat( szWhenDay, "Each " ); ! 1454: ! 1455: } else if ( pAtEnum->DaysOfWeek != 0 || pAtEnum->DaysOfMonth != 0 ) { ! 1456: ! 1457: lstrcat( szWhenDay, "Next " ); ! 1458: ! 1459: } else if ( pAtEnum->Flags & JOB_RUNS_TODAY ) { ! 1460: ! 1461: lstrcat( szWhenDay, "Today " ); ! 1462: ! 1463: } else { ! 1464: ! 1465: lstrcat( szWhenDay, "Tomorrow " ); ! 1466: ! 1467: } ! 1468: ! 1469: if ( pAtEnum->DaysOfWeek != 0 ) { ! 1470: ! 1471: for ( i=0; i<7; ++i ) { ! 1472: ! 1473: if ( ( pAtEnum->DaysOfWeek & ( 1 << i ) ) != 0 ) { ! 1474: ! 1475: lstrcat( szWhenDay, szDayAbbr[i] ); ! 1476: ! 1477: } ! 1478: ! 1479: } ! 1480: ! 1481: } ! 1482: ! 1483: if ( pAtEnum->DaysOfMonth != 0 ) { ! 1484: ! 1485: for ( i=0; i<31; ++i ) { ! 1486: ! 1487: if ( ( pAtEnum->DaysOfMonth & ( 1L << i ) ) != 0 ) { ! 1488: ! 1489: wsprintf( szDateAbbr, "%d ", i+1 ); ! 1490: ! 1491: lstrcat( szWhenDay, szDateAbbr ); ! 1492: ! 1493: } ! 1494: ! 1495: } ! 1496: ! 1497: } ! 1498: ! 1499: ! 1500: dwTime = pAtEnum->JobTime / 1000 / 60; // total minutes ! 1501: ! 1502: szTime[0] = (UCHAR)( dwTime / 600 ) + '0'; // 10s of hours ! 1503: dwTime %= 600; ! 1504: ! 1505: szTime[1] = (UCHAR)( dwTime / 60 ) + '0'; // 1s of hours ! 1506: dwTime %= 60; ! 1507: ! 1508: szTime[2] = ':'; ! 1509: ! 1510: szTime[3] = (UCHAR)( dwTime / 10 ) + '0'; // 10s of minutes ! 1511: dwTime %= 10; ! 1512: ! 1513: szTime[4] = (UCHAR)( dwTime ) + '0'; // 1s of minutes ! 1514: ! 1515: szTime[5] = '\0'; ! 1516: ! 1517: // convert this 24-hour time to AM/PM form ! 1518: ! 1519: szTime[5] = 'A'; ! 1520: szTime[6] = 'M'; ! 1521: szTime[7] = '\0'; ! 1522: ! 1523: // if it is past 1000 but before 2000 (24-hour time) ! 1524: ! 1525: if ( szTime[0] == '1' ) { ! 1526: ! 1527: // if it is past 1100 ! 1528: ! 1529: if ( szTime[1] >= '2' ) { ! 1530: ! 1531: szTime[5] = 'P'; ! 1532: ! 1533: } ! 1534: ! 1535: if( szTime [1] > '2' ) { ! 1536: ! 1537: szTime[0] -= 1; ! 1538: szTime[1] -= 2; ! 1539: ! 1540: } ! 1541: ! 1542: } else if ( szTime[0] == '2' ) { ! 1543: ! 1544: // it is 2000 or later ! 1545: ! 1546: szTime[5] = 'P'; ! 1547: ! 1548: // if it is 2200 or later ! 1549: ! 1550: if( szTime [1] >= '2' ) { ! 1551: ! 1552: szTime[0] -= 1; ! 1553: szTime[1] -= 2; ! 1554: ! 1555: } else { ! 1556: ! 1557: szTime[0] -= 2; ! 1558: szTime[1] += 8; ! 1559: ! 1560: } ! 1561: ! 1562: } ! 1563: ! 1564: if ( szTime[0] == '0' ) { ! 1565: ! 1566: if ( szTime[1] == '0' ) { ! 1567: ! 1568: // 12 am or pm ! 1569: ! 1570: szTime[0] = '1'; ! 1571: szTime[1] = '2'; ! 1572: ! 1573: } else { ! 1574: ! 1575: szTime[0] = ' '; ! 1576: ! 1577: } ! 1578: ! 1579: } ! 1580: ! 1581: WideCharToMultiByte( ! 1582: CP_ACP, ! 1583: 0, ! 1584: pAtEnum->Command, ! 1585: -1, ! 1586: szCommandM, ! 1587: MAXCOMMANDLEN, ! 1588: szDefault, ! 1589: &fFlag ! 1590: ); ! 1591: ! 1592: wsprintf( szAtCommand, "%d\t", pAtEnum->JobId ); ! 1593: lstrcat( szAtCommand, szWhenDay ); ! 1594: lstrcat( szAtCommand, "\t" ); ! 1595: lstrcat( szAtCommand, szTime ); ! 1596: lstrcat( szAtCommand, "\t" ); ! 1597: lstrcat( szAtCommand, szCommandM ); ! 1598: ! 1599: WAddExtentEntry( GetDlgItem( hGlobalhWnd, IDC_ATCOMMANDS ), szAtCommand ); ! 1600: SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_ADDSTRING, 0, (LPARAM)szAtCommand ); ! 1601: ! 1602: } ! 1603: ! 1604: if ( EnumBuffer != NULL ) { ! 1605: ! 1606: (VOID)NetApiBufferFree( (LPVOID)EnumBuffer ); ! 1607: EnumBuffer = NULL; ! 1608: ! 1609: } ! 1610: ! 1611: if ( status == ERROR_SUCCESS ) { ! 1612: ! 1613: break; // we have read & displayed all the items ! 1614: ! 1615: } ! 1616: ! 1617: } // for ! 1618: ! 1619: if ( first == TRUE) { ! 1620: ! 1621: ResetListboxExtents( GetDlgItem( hGlobalhWnd, IDC_ATCOMMANDS ) ); ! 1622: SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_RESETCONTENT, 0, 0 ); ! 1623: WAddExtentEntry( GetDlgItem( hGlobalhWnd, IDC_ATCOMMANDS ), szNoEntries ); ! 1624: SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_ADDSTRING, 0, (LPARAM)szNoEntries ); ! 1625: ! 1626: EnableWindow( GetDlgItem( hGlobalhWnd, IDC_ADD ), TRUE ); ! 1627: EnableWindow( GetDlgItem( hGlobalhWnd, IDC_CHANGE ), FALSE ); ! 1628: EnableWindow( GetDlgItem( hGlobalhWnd, IDC_REMOVE ), FALSE ); ! 1629: ! 1630: } else { ! 1631: ! 1632: switch ( LOWORD( SetCurrentSelection ) ) { ! 1633: ! 1634: case SCS_BOTTOM: ! 1635: ! 1636: uSelection = SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_GETCOUNT, 0, 0 ) - 1; ! 1637: ! 1638: SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_SETCURSEL, uSelection, 0 ); ! 1639: ! 1640: break; ! 1641: ! 1642: case SCS_NOCHANGE: ! 1643: ! 1644: // uSelection has already been set ! 1645: ! 1646: SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_SETCURSEL, uSelection, 0 ); ! 1647: ! 1648: break; ! 1649: ! 1650: case SCS_TOP: ! 1651: ! 1652: uSelection = 0; ! 1653: ! 1654: SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_SETCURSEL, uSelection, 0 ); ! 1655: ! 1656: break; ! 1657: ! 1658: case SCS_SELINHIGHWORD: ! 1659: ! 1660: uSelection = HIWORD( SetCurrentSelection ); ! 1661: ! 1662: SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_SETCURSEL, uSelection, 0 ); ! 1663: ! 1664: break; ! 1665: ! 1666: case SCS_NONE: ! 1667: default: ! 1668: ! 1669: break; ! 1670: ! 1671: } ! 1672: ! 1673: SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_SETTOPINDEX, uTopIndex, 0 ); ! 1674: ! 1675: EnableWindow( GetDlgItem( hGlobalhWnd, IDC_ADD ), TRUE ); ! 1676: EnableWindow( GetDlgItem( hGlobalhWnd, IDC_CHANGE ), TRUE ); ! 1677: EnableWindow( GetDlgItem( hGlobalhWnd, IDC_REMOVE ), TRUE ); ! 1678: ! 1679: } ! 1680: ! 1681: return( ERROR_SUCCESS ); ! 1682: ! 1683: } ! 1684: ! 1685: ! 1686: ! 1687: ! 1688: //=========================================================================== ! 1689: // FUNCTION: MessagePrint() ! 1690: //=========================================================================== ! 1691: DWORD ! 1692: MessagePrint( ! 1693: IN DWORD MessageId, ! 1694: ... ! 1695: ) ! 1696: /*++ ! 1697: ! 1698: Routine Description: ! 1699: ! 1700: Finds the unicode message corresponding to the supplied message id, ! 1701: merges it with caller supplied string(s), and prints the resulting ! 1702: string. ! 1703: ! 1704: Arguments: ! 1705: ! 1706: MessageId - message id ! 1707: ! 1708: Return Value: ! 1709: ! 1710: Count of characters, not counting the terminating null character, ! 1711: printed by this routine. Zero return value indicates failure. ! 1712: ! 1713: --*/ ! 1714: { ! 1715: va_list arglist; ! 1716: UCHAR * buffer = NULL; ! 1717: UCHAR * ptr; ! 1718: DWORD length; ! 1719: LPVOID lpSource; ! 1720: DWORD dwFlags = FORMAT_MESSAGE_ARGUMENT_ARRAY | ! 1721: FORMAT_MESSAGE_ALLOCATE_BUFFER; ! 1722: ! 1723: ! 1724: va_start( arglist, MessageId ); ! 1725: ! 1726: if ( MessageId < NERR_BASE) { ! 1727: // ! 1728: // Get message from system. ! 1729: // ! 1730: lpSource = NULL; // redundant step according to FormatMessage() spec ! 1731: dwFlags |= FORMAT_MESSAGE_FROM_SYSTEM; ! 1732: ! 1733: } else if ( ( MessageId >= APE2_AT_DEL_WARNING ! 1734: && MessageId <= APE2_AT_DI_COMMAND) ! 1735: // ! 1736: // I cannot find these definitions!!!! ! 1737: // ! 1738: //|| ( MessageId >= IDS_LOAD_LIBRARY_FAILURE ! 1739: // && MessageId <= IDS_USAGE ) ! 1740: ) { ! 1741: // ! 1742: // Get message from this module. ! 1743: // ! 1744: lpSource = NULL; ! 1745: dwFlags |= FORMAT_MESSAGE_FROM_HMODULE; ! 1746: ! 1747: } else { ! 1748: // ! 1749: // Get message from netmsg.dll. ! 1750: // ! 1751: lpSource = GlobalMessageHandle; ! 1752: dwFlags |= FORMAT_MESSAGE_FROM_HMODULE; ! 1753: } ! 1754: ! 1755: length = FormatMessage( ! 1756: dwFlags, // dwFlags ! 1757: lpSource, // lpSource ! 1758: MessageId, // MessageId ! 1759: 0L, // dwLanguageId ! 1760: (LPTSTR)&buffer, // lpBuffer ! 1761: 0, // size ! 1762: (va_list *) arglist // lpArguments ! 1763: ); ! 1764: ! 1765: if ( length != 0) { ! 1766: ! 1767: //change to MessageBox ! 1768: //printf( "%ws", buffer ); ! 1769: ! 1770: ptr = buffer; ! 1771: ! 1772: while ( *ptr ) { ! 1773: ! 1774: if ( ( *ptr < ' ' ) || ( *ptr > '~' ) ) { ! 1775: ! 1776: *ptr = ' '; ! 1777: ! 1778: } ! 1779: ! 1780: ptr++; ! 1781: ! 1782: } ! 1783: ! 1784: SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_RESETCONTENT, 0, 0 ); ! 1785: ! 1786: SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)buffer ); ! 1787: ! 1788: MessageBox( hGlobalhWnd, (LPCTSTR)buffer, SZWINDOWTITLE, MB_OK | MB_ICONEXCLAMATION ); ! 1789: ! 1790: LocalFree( buffer ); ! 1791: ! 1792: } ! 1793: ! 1794: return( length); ! 1795: ! 1796: } // MessagePrint() ! 1797: ! 1798: ! 1799: ! 1800: //=========================================================================== ! 1801: // FUNCTION: MinProc() ! 1802: //=========================================================================== ! 1803: LRESULT APIENTRY MinProc( HWND hWnd, UINT message, UINT uParam, LONG lParam ) ! 1804: { ! 1805: UINT uCurVal; ! 1806: UCHAR szCurVal[3]; ! 1807: ! 1808: switch ( message ) { ! 1809: ! 1810: case WM_COPY: ! 1811: case WM_PASTE: ! 1812: case WM_CUT: ! 1813: ! 1814: // cut and paste dont seem to work... ! 1815: ! 1816: break; ! 1817: ! 1818: case WM_CHAR: ! 1819: ! 1820: if ( uParam == VK_BACK ) { ! 1821: ! 1822: if ( uMinChars > 0 ) { ! 1823: ! 1824: --uMinChars; ! 1825: ! 1826: } ! 1827: ! 1828: return CallWindowProc( (WNDPROC)lpMinDefProc, hWnd, message, uParam, lParam ) ; ! 1829: ! 1830: } else { ! 1831: ! 1832: uMinChars = (UINT) SendMessage( hWnd, WM_GETTEXT, 2, (LPARAM)szCurVal ); ! 1833: ! 1834: if ( uMinChars == 0 ) { ! 1835: ! 1836: uCurVal = 0; ! 1837: ! 1838: } else if ( uMinChars == 1 ) { ! 1839: ! 1840: uCurVal = szCurVal[0] - '0'; ! 1841: ! 1842: } else if ( uMinChars == 2 ) { ! 1843: ! 1844: uCurVal = szCurVal[0] - '0'; ! 1845: uCurVal *= 10; ! 1846: uCurVal = szCurVal[1] - '0'; ! 1847: ! 1848: } else if ( uMinChars > 2 ) { ! 1849: ! 1850: uMinChars = 0; ! 1851: ! 1852: SendMessage( hWnd, WM_SETTEXT, 0, (LPARAM)"" ); ! 1853: ! 1854: return( 0 ); ! 1855: ! 1856: } ! 1857: ! 1858: } ! 1859: ! 1860: if ( ( uParam == ' ' ) || // space ! 1861: ( uParam < '0' || uParam > '9' ) || // not a number ! 1862: ( uCurVal >= 6 ) // greater than 59 ! 1863: ) { ! 1864: ! 1865: MessageBeep( MB_OK ); ! 1866: ! 1867: return( 0 ); ! 1868: ! 1869: } else if ( uMinChars < 2 ) { ! 1870: ! 1871: ++uMinChars; ! 1872: ! 1873: } else { ! 1874: ! 1875: MessageBeep( MB_OK ); ! 1876: ! 1877: return( 0 ); ! 1878: ! 1879: } ! 1880: ! 1881: break; ! 1882: ! 1883: } // switch ! 1884: ! 1885: return CallWindowProc( (WNDPROC)lpMinDefProc, hWnd, message, uParam, lParam ) ; ! 1886: ! 1887: } ! 1888: ! 1889: ! 1890: ! 1891: //=========================================================================== ! 1892: // FUNCTION: Refresh() ! 1893: //=========================================================================== ! 1894: UINT ! 1895: Refresh(UINT Command) ! 1896: { ! 1897: ! 1898: static BOOL fOkayToRefresh; ! 1899: static BOOL fOkayToRefreshSave; ! 1900: ! 1901: switch( Command ) { ! 1902: ! 1903: case REFRESH_FALSE: ! 1904: ! 1905: fOkayToRefresh = FALSE; ! 1906: ! 1907: break; ! 1908: ! 1909: case REFRESH_TRUE: ! 1910: ! 1911: fOkayToRefresh = TRUE; ! 1912: ! 1913: break; ! 1914: ! 1915: case REFRESH_QUERY: ! 1916: ! 1917: return( fOkayToRefresh ); ! 1918: ! 1919: break; ! 1920: ! 1921: case REFRESH_SAVE: ! 1922: ! 1923: fOkayToRefreshSave = fOkayToRefresh; ! 1924: ! 1925: break; ! 1926: ! 1927: case REFRESH_RESTORE: ! 1928: ! 1929: fOkayToRefresh = fOkayToRefreshSave; ! 1930: ! 1931: break; ! 1932: } ! 1933: ! 1934: return( REFRESH_ERROR ); ! 1935: ! 1936: } ! 1937: ! 1938: ! 1939: ! 1940: //=========================================================================== ! 1941: // FUNCTION: SelectComputerProc() ! 1942: //=========================================================================== ! 1943: BOOL APIENTRY SelectComputerProc( ! 1944: HWND hWnd, // window handle ! 1945: UINT message, // type of message ! 1946: UINT uParam, // additional information ! 1947: LONG lParam) // additional information ! 1948: { ! 1949: ! 1950: DWORD dwLen = MAXCOMPUTERNAMELEN + 1; ! 1951: UCHAR szSelectComputer[MAXCOMPUTERNAMELEN+1]; ! 1952: int wmEvent; ! 1953: int wmId; ! 1954: ! 1955: switch (message) { ! 1956: ! 1957: case WM_INITDIALOG: ! 1958: ! 1959: SendDlgItemMessage( hWnd, IDC_SELECTCOMPUTER, WM_SETFONT, (WPARAM)hFont, 0 ); ! 1960: ! 1961: if ( !GetComputerName( szSelectComputer, &dwLen ) ) { ! 1962: ! 1963: MessageBox( hWnd, "Problem getting computer name.", SZWINDOWTITLE, MB_OK | MB_ICONEXCLAMATION ); ! 1964: ! 1965: } else { ! 1966: ! 1967: SetDlgItemText( hWnd, IDC_SELECTCOMPUTER, szSelectComputer ); ! 1968: ! 1969: } ! 1970: ! 1971: break; ! 1972: ! 1973: case WM_COMMAND: // message: command from application menu ! 1974: ! 1975: // Message packing of uParam and lParam have changed for Win32, let us ! 1976: // handle the differences in a conditional compilation: ! 1977: ! 1978: wmId = LOWORD(uParam); ! 1979: wmEvent = HIWORD(uParam); ! 1980: ! 1981: switch (wmId) { ! 1982: ! 1983: case IDCANCEL: ! 1984: ! 1985: EndDialog( hWnd, IDCANCEL ); ! 1986: ! 1987: break; ! 1988: ! 1989: case IDOK: ! 1990: ! 1991: GetDlgItemText( hWnd, IDC_SELECTCOMPUTER, &szComputerM[2], MAXCOMPUTERNAMELEN ); ! 1992: ! 1993: if ( lstrlen(&szComputerM[2]) > 15 || lstrlen(&szComputerM[2]) == 0 ) { ! 1994: ! 1995: MessageBox( hWnd, "Computer names are 1 to 15 characters long.", SZWINDOWTITLE, MB_OK | MB_ICONEXCLAMATION ); ! 1996: ! 1997: } else { ! 1998: ! 1999: SetDlgItemText( hGlobalhWnd, IDC_COMPUTER, &szComputerM[2] ); ! 2000: ! 2001: szComputerM[0] = '\\'; ! 2002: szComputerM[1] = '\\'; ! 2003: ! 2004: MultiByteToWideChar( ! 2005: CP_ACP, ! 2006: MB_PRECOMPOSED, ! 2007: szComputerM, ! 2008: -1, ! 2009: szComputerW, ! 2010: MAXCOMPUTERNAMELEN ! 2011: ); ! 2012: ! 2013: GlobalComputerName = szComputerW; ! 2014: ! 2015: Refresh( REFRESH_TRUE ); ! 2016: ! 2017: EndDialog( hWnd, IDOK ); ! 2018: ! 2019: } ! 2020: ! 2021: break; ! 2022: ! 2023: } ! 2024: ! 2025: break; ! 2026: ! 2027: } ! 2028: ! 2029: return (0); ! 2030: ! 2031: } ! 2032: ! 2033: ! 2034: ! 2035: //=========================================================================== ! 2036: // FUNCTION: ServiceNotStartedHandler() ! 2037: //=========================================================================== ! 2038: BOOL ! 2039: ServiceNotStartedHandler(VOID) ! 2040: { ! 2041: ! 2042: BOOL Done; ! 2043: SC_HANDLE schSCManager; ! 2044: SC_HANDLE schService; ! 2045: SERVICE_STATUS ssServiceStatus; ! 2046: UCHAR szService[] = "Schedule"; ! 2047: UCHAR szTemp[80]; ! 2048: ! 2049: wsprintf( szTemp, "Schedule service on %s not started.\nWould you like to start it?", &szComputerM[2] ); ! 2050: ! 2051: if ( MessageBox( hGlobalhWnd, szTemp, SZWINDOWTITLE, MB_YESNO ) == IDYES ) { ! 2052: ! 2053: schSCManager = OpenSCManager( szComputerM, NULL, SC_MANAGER_ALL_ACCESS ); ! 2054: ! 2055: if ( schSCManager == NULL ) { ! 2056: ! 2057: wsprintf( szTemp, "Problem accessing Service Control Manager.\n\nError %d.", GetLastError() ); ! 2058: ! 2059: MessageBox( hGlobalhWnd, szTemp, SZWINDOWTITLE, MB_OK | MB_ICONEXCLAMATION ); ! 2060: ! 2061: return( FALSE ); ! 2062: ! 2063: } else { ! 2064: ! 2065: schService = OpenService( schSCManager, szService, SERVICE_ALL_ACCESS ); ! 2066: ! 2067: if ( schService == NULL ) { ! 2068: ! 2069: wsprintf( szTemp, "Problem opening Schedule service.\n\nError %d.", GetLastError() ); ! 2070: ! 2071: MessageBox( hGlobalhWnd, szTemp, SZWINDOWTITLE, MB_OK | MB_ICONEXCLAMATION ); ! 2072: ! 2073: return( FALSE ); ! 2074: ! 2075: } else { ! 2076: ! 2077: if ( StartService( schService, 0, NULL ) == FALSE ) { ! 2078: ! 2079: wsprintf( szTemp, "Problem starting Schedule service.\n\nError %d.", GetLastError() ); ! 2080: ! 2081: MessageBox( hGlobalhWnd, szTemp, SZWINDOWTITLE, MB_OK | MB_ICONEXCLAMATION ); ! 2082: ! 2083: return( FALSE ); ! 2084: ! 2085: } else { ! 2086: ! 2087: // wait for service to start ! 2088: ! 2089: Done = FALSE; ! 2090: ! 2091: while( !Done ) { ! 2092: ! 2093: if ( QueryServiceStatus( schService, &ssServiceStatus ) == FALSE ) { ! 2094: ! 2095: wsprintf( szTemp, "Problem getting service status.\n\nError %d.", GetLastError() ); ! 2096: ! 2097: MessageBox( hGlobalhWnd, szTemp, SZWINDOWTITLE, MB_OK | MB_ICONEXCLAMATION ); ! 2098: ! 2099: return( FALSE ); ! 2100: ! 2101: } else { ! 2102: ! 2103: switch ( ssServiceStatus.dwCurrentState ) { ! 2104: ! 2105: case SERVICE_START_PENDING: ! 2106: ! 2107: Sleep( ssServiceStatus.dwWaitHint ); ! 2108: ! 2109: break; ! 2110: ! 2111: case SERVICE_RUNNING: ! 2112: ! 2113: Done = TRUE; ! 2114: ! 2115: break; ! 2116: ! 2117: default: ! 2118: ! 2119: wsprintf( szTemp, "Unexpected service state.\n\nState %d.", ssServiceStatus.dwCurrentState ); ! 2120: ! 2121: MessageBox( hGlobalhWnd, szTemp, SZWINDOWTITLE, MB_OK | MB_ICONEXCLAMATION ); ! 2122: ! 2123: Done = TRUE; ! 2124: ! 2125: break; ! 2126: ! 2127: } ! 2128: ! 2129: } ! 2130: ! 2131: } ! 2132: ! 2133: } ! 2134: ! 2135: CloseServiceHandle(schService); ! 2136: ! 2137: } ! 2138: ! 2139: CloseServiceHandle(schSCManager); ! 2140: ! 2141: } ! 2142: ! 2143: SendDlgItemMessage( hGlobalhWnd, IDC_ATCOMMANDS, LB_RESETCONTENT, 0, 0 ); ! 2144: ! 2145: SendDlgItemMessage( ! 2146: hGlobalhWnd, ! 2147: IDC_ATCOMMANDS, ! 2148: LB_ADDSTRING, ! 2149: 0, ! 2150: (LPARAM)"The Schedule service was started successfully." ); ! 2151: ! 2152: MessageBox( ! 2153: hGlobalhWnd, ! 2154: "The Schedule service was started successfully.", ! 2155: SZWINDOWTITLE, ! 2156: MB_OK ); ! 2157: ! 2158: return( TRUE ); ! 2159: ! 2160: } else { ! 2161: ! 2162: Refresh( REFRESH_FALSE ); ! 2163: ! 2164: MessageBox( ! 2165: hGlobalhWnd, ! 2166: "The display will not be refreshed automatically. Chose File, Select Computer to refresh the display.", ! 2167: SZWINDOWTITLE, ! 2168: MB_OK | MB_ICONEXCLAMATION ); ! 2169: ! 2170: } ! 2171: ! 2172: return( FALSE ); ! 2173: ! 2174: } ! 2175: ! 2176: ! 2177: ! 2178: //=========================================================================== ! 2179: // FUNCTION: UpButtonProc() ! 2180: //=========================================================================== ! 2181: LRESULT APIENTRY UpButtonProc( HWND hWnd, UINT message, UINT uParam, LONG lParam ) ! 2182: { ! 2183: switch ( message ) { ! 2184: ! 2185: case WM_SETFOCUS: ! 2186: ! 2187: if ( (uParam == (UINT)hHour) || (uParam == (UINT)hMin) || (uParam == (UINT)hAmPm) ) { ! 2188: ! 2189: hCurrentFocus = (HWND)uParam; ! 2190: ! 2191: PostMessage( hGlobalAddChg, WM_SPINBUTTON, uParam, (LONG)UP ); ! 2192: ! 2193: } else { ! 2194: ! 2195: hCurrentFocus = (HWND)uParam; ! 2196: ! 2197: } ! 2198: ! 2199: break; ! 2200: ! 2201: } // switch ! 2202: ! 2203: return CallWindowProc( (WNDPROC)lpUpButtonDefProc, hWnd, message, uParam, lParam ) ; ! 2204: ! 2205: } ! 2206: ! 2207: ! 2208: ! 2209: //=========================================================================== ! 2210: // FUNCTION: ValidateAddChangeArguments() ! 2211: //=========================================================================== ! 2212: BOOL ! 2213: ValidateAddChangeArguments( ! 2214: HWND hWnd ! 2215: ) ! 2216: { ! 2217: ! 2218: SYSTEMTIME SysTime; ! 2219: UCHAR szAmPm[3]; ! 2220: UINT Items[NUMDAYITEMS]; ! 2221: UINT NumSelected; ! 2222: UINT i; ! 2223: ! 2224: // initialize ! 2225: ! 2226: memset( (PBYTE)&GlobalAtInfo, '\0', sizeof(GlobalAtInfo) ); ! 2227: ! 2228: // command ! 2229: ! 2230: SendDlgItemMessage( hWnd, IDC_NEWCOMMAND, WM_GETTEXT, MAXCOMMANDLEN, (LPARAM)szCommandM ); ! 2231: ! 2232: if ( szCommandM[0] == 0 ) { ! 2233: ! 2234: MessageBox( ! 2235: hWnd, ! 2236: "Enter a command.", ! 2237: SZWINDOWTITLE, ! 2238: MB_OK | MB_ICONEXCLAMATION ! 2239: ); ! 2240: ! 2241: SetFocus( GetDlgItem( hWnd, IDC_NEWCOMMAND ) ); ! 2242: ! 2243: return ( FALSE ); ! 2244: ! 2245: } ! 2246: ! 2247: MultiByteToWideChar( ! 2248: CP_ACP, ! 2249: MB_PRECOMPOSED, ! 2250: szCommandM, ! 2251: -1, ! 2252: szCommandW, ! 2253: MAXCOMMANDLEN ! 2254: ); ! 2255: ! 2256: GlobalAtInfo.Command = szCommandW; ! 2257: ! 2258: // hours ! 2259: ! 2260: GlobalAtInfo.JobTime = GetDlgItemInt( hWnd, IDC_HOUR, NULL, FALSE ); ! 2261: ! 2262: GetDlgItemText( hWnd, IDC_AMPM, (LPTSTR)&szAmPm, sizeof(szAmPm) ); ! 2263: ! 2264: if ( szAmPm[0] == 'P' || szAmPm[0] == 'p' ) { ! 2265: ! 2266: if( GlobalAtInfo.JobTime != 12 ) { ! 2267: ! 2268: GlobalAtInfo.JobTime += 12; ! 2269: ! 2270: } ! 2271: ! 2272: } else if( GlobalAtInfo.JobTime == 12 ) { ! 2273: ! 2274: GlobalAtInfo.JobTime = 0; ! 2275: ! 2276: } ! 2277: ! 2278: ! 2279: // convert to minutes ! 2280: ! 2281: GlobalAtInfo.JobTime *= 60; ! 2282: ! 2283: // add minutes ! 2284: ! 2285: GlobalAtInfo.JobTime += GetDlgItemInt( hWnd, IDC_MIN, NULL, FALSE ); ! 2286: ! 2287: // convert to milliseconds ! 2288: ! 2289: GlobalAtInfo.JobTime *= 60 * 1000; ! 2290: ! 2291: GetLocalTime( &SysTime ); ! 2292: ! 2293: if ( SendDlgItemMessage( hWnd, IDC_TODAY, BM_GETCHECK, 0, 0 ) ) { ! 2294: ! 2295: if ( (DWORD)( (SysTime.wHour * 60 + SysTime.wMinute) * 60 * 1000) >= GlobalAtInfo.JobTime ) { ! 2296: ! 2297: MessageBox( ! 2298: hWnd, ! 2299: "The time you have selected has already passed. The command will run tomorrow.", ! 2300: SZWINDOWTITLE, ! 2301: MB_OK | MB_ICONEXCLAMATION ! 2302: ); ! 2303: ! 2304: } ! 2305: ! 2306: } ! 2307: ! 2308: if ( SendDlgItemMessage( hWnd, IDC_EVERY, BM_GETCHECK, 0, 0 ) || ! 2309: SendDlgItemMessage( hWnd, IDC_NEXT, BM_GETCHECK, 0, 0 ) ) { ! 2310: ! 2311: // day ! 2312: // NOTE: I am assuming that this lisbox will always be correct ! 2313: // and if you select Today/Tomorrow the proper day is selected. ! 2314: ! 2315: NumSelected = SendDlgItemMessage( hWnd, IDC_DAYS, LB_GETSELCOUNT, 0, 0 ); ! 2316: ! 2317: if ( NumSelected == 0 ) { ! 2318: ! 2319: MessageBox( ! 2320: hWnd, ! 2321: "Select the day(s) this command will run.", ! 2322: SZWINDOWTITLE, ! 2323: MB_OK | MB_ICONEXCLAMATION ! 2324: ); ! 2325: ! 2326: SetFocus( GetDlgItem( hWnd, IDC_DAYS ) ); ! 2327: ! 2328: return ( FALSE ); ! 2329: ! 2330: } ! 2331: ! 2332: SendDlgItemMessage( hWnd, IDC_DAYS, LB_GETSELITEMS, NUMDAYITEMS, (LPARAM)Items ); ! 2333: ! 2334: for( i=0; i<NumSelected; ++i ) { ! 2335: ! 2336: if ( Items[i] > 6 ) { ! 2337: ! 2338: // days of month ! 2339: //0-based, 7 and up are dates (1-31) ! 2340: ! 2341: GlobalAtInfo.DaysOfMonth |= ( 1 << ( Items[i]-7 ) ); ! 2342: ! 2343: } else { ! 2344: ! 2345: // days of week ! 2346: // 0-based, first 7 are days (M-Su) ! 2347: ! 2348: GlobalAtInfo.DaysOfWeek |= ( 1 << Items[i] ); ! 2349: ! 2350: } ! 2351: ! 2352: } ! 2353: ! 2354: // flags ! 2355: ! 2356: if ( SendDlgItemMessage( hWnd, IDC_EVERY, BM_GETCHECK, 0, 0 ) ) { ! 2357: ! 2358: GlobalAtInfo.Flags |= JOB_RUN_PERIODICALLY; ! 2359: ! 2360: } ! 2361: ! 2362: } else if ( SendDlgItemMessage( hWnd, IDC_TOMORROW, BM_GETCHECK, 0, 0 ) ) { ! 2363: ! 2364: i = SendDlgItemMessage( hWnd, IDC_DAYS, LB_GETCURSEL, 0, 0 ); ! 2365: ! 2366: if ( i == 0 ) { ! 2367: ! 2368: // set to Sunday ! 2369: ! 2370: GlobalAtInfo.DaysOfWeek = ( 1 << 6 ); ! 2371: ! 2372: } else { ! 2373: ! 2374: // increment to tomorrow ! 2375: ! 2376: GlobalAtInfo.DaysOfWeek |= ( 1 << i ); ! 2377: ! 2378: } ! 2379: ! 2380: } ! 2381: ! 2382: return( TRUE ); ! 2383: ! 2384: } ! 2385: ! 2386: ! 2387: ! 2388: //=========================================================================== ! 2389: // FUNCTION: WINATDlgProc() ! 2390: //=========================================================================== ! 2391: BOOL APIENTRY WINATDlgProc( ! 2392: HWND hWnd, // window handle ! 2393: UINT message, // type of message ! 2394: UINT uParam, // additional information ! 2395: LONG lParam) // additional information ! 2396: { ! 2397: ! 2398: FARPROC lpAddChangeDlgProc; // pointer to the "AddChange" function ! 2399: FARPROC lpProcSelect; ! 2400: NET_API_STATUS status; ! 2401: int wmEvent; ! 2402: int wmId; ! 2403: int iDlgRetCode; ! 2404: ! 2405: switch (message) { ! 2406: ! 2407: case WM_INITDIALOG: ! 2408: ! 2409: lf.lfEscapement = 0; ! 2410: lf.lfOrientation = 0; ! 2411: lf.lfOutPrecision = OUT_DEFAULT_PRECIS; ! 2412: lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; ! 2413: lf.lfHeight = 14; ! 2414: lf.lfWidth = 0; //6; //5 ! 2415: lf.lfWeight = 0; ! 2416: ! 2417: lf.lfItalic = 0; ! 2418: lf.lfUnderline = 0; ! 2419: lf.lfStrikeOut = 0; ! 2420: ! 2421: lf.lfPitchAndFamily=VARIABLE_PITCH | FF_SWISS; ! 2422: ! 2423: hFont = CreateFontIndirect( &lf ); ! 2424: ! 2425: if ( hFont != NULL ) { ! 2426: ! 2427: SendDlgItemMessage( hWnd, IDC_ATCOMMANDS, WM_SETFONT, (WPARAM)hFont, 1L ); ! 2428: ! 2429: } else { ! 2430: ! 2431: MessageBox( hWnd, "Problem creating font.", SZWINDOWTITLE, MB_OK | MB_ICONEXCLAMATION ); ! 2432: ! 2433: } ! 2434: ! 2435: hCursorWait = LoadCursor( NULL, IDC_WAIT ); ! 2436: ! 2437: if ( !FInitListboxExtents( GetDlgItem( hWnd, IDC_ATCOMMANDS ) ) ) { ! 2438: ! 2439: MessageBox( hWnd, "Scrolling broken", SZWINDOWTITLE, MB_OK | MB_ICONEXCLAMATION ); ! 2440: ! 2441: } ! 2442: ! 2443: hGlobalhWnd = hWnd; ! 2444: ! 2445: // get values from registry ! 2446: ! 2447: SendMessage(hWnd, WM_COMMAND, IDM_GET_FROM_REGISTRY, 0); ! 2448: ! 2449: // set tabstops for commands ! 2450: ! 2451: { ! 2452: ! 2453: UINT Tabs[3] = { 25, 110, 145 }; ! 2454: ! 2455: SendDlgItemMessage( hWnd, IDC_ATCOMMANDS, LB_SETTABSTOPS, 3, (LPARAM)Tabs ); ! 2456: ! 2457: } ! 2458: ! 2459: // get local computer name ! 2460: ! 2461: { ! 2462: ! 2463: DWORD dwLen = MAXCOMPUTERNAMELEN; ! 2464: ! 2465: if ( !GetComputerName( &szComputerM[2], &dwLen ) ) { ! 2466: ! 2467: MessageBox( hWnd, "Problem getting computer name", SZWINDOWTITLE, MB_OK | MB_ICONEXCLAMATION ); ! 2468: ! 2469: } else { ! 2470: ! 2471: szComputerM[0] = '\\'; ! 2472: szComputerM[1] = '\\'; ! 2473: ! 2474: MultiByteToWideChar( ! 2475: CP_ACP, ! 2476: MB_PRECOMPOSED, ! 2477: szComputerM, ! 2478: -1, ! 2479: szComputerW, ! 2480: MAXCOMMANDLEN ! 2481: ); ! 2482: ! 2483: // set GlobalComputerName for all functions to use ! 2484: // only Select Computer will ever change this value ! 2485: ! 2486: GlobalComputerName = szComputerW; ! 2487: ! 2488: SendDlgItemMessage( hWnd, IDC_COMPUTER, WM_SETTEXT, 0, (LPARAM)&szComputerM[2] ); ! 2489: ! 2490: } ! 2491: ! 2492: } ! 2493: ! 2494: // set initial states of buttons to disabled ! 2495: ! 2496: EnableWindow( GetDlgItem( hGlobalhWnd, IDC_ADD ), FALSE ); ! 2497: EnableWindow( GetDlgItem( hGlobalhWnd, IDC_CHANGE ), FALSE ); ! 2498: EnableWindow( GetDlgItem( hGlobalhWnd, IDC_REMOVE ), FALSE ); ! 2499: ! 2500: // initialize the commands window ! 2501: ! 2502: SendDlgItemMessage( hWnd, IDC_ATCOMMANDS, LB_ADDSTRING, 0, (LPARAM)"Initializing" ); ! 2503: ! 2504: // set up timer to go off very soon after the dlgbox is created ! 2505: ! 2506: uTimer = SetTimer( hWnd, 1, 1000, NULL ); ! 2507: fTimer = FIRST_TIME; ! 2508: Refresh( REFRESH_TRUE ); ! 2509: ! 2510: ! 2511: GlobalMessageHandle = LoadLibrary( "netmsg.dll" ); ! 2512: ! 2513: if ( GlobalMessageHandle == NULL ) { ! 2514: ! 2515: ;// MessagePrint( IDS_LOAD_LIBRARY_FAILURE, GetLastError() ); ! 2516: ! 2517: } ! 2518: ! 2519: break; ! 2520: ! 2521: case WM_TIMER: ! 2522: ! 2523: if ( fTimer == FIRST_TIME ) { ! 2524: ! 2525: uTimer = SetTimer( hWnd, 1, REFRESH_RATE, NULL ); ! 2526: ! 2527: fTimer = !FIRST_TIME; ! 2528: ! 2529: } ! 2530: ! 2531: if ( Refresh( REFRESH_QUERY ) == TRUE ) { ! 2532: ! 2533: SendMessage( hWnd, WM_COMMAND, IDC_REFRESH, (LPARAM)SCS_NOCHANGE ); ! 2534: ! 2535: } ! 2536: ! 2537: break; ! 2538: ! 2539: case WM_COMMAND: // message: command from application menu ! 2540: ! 2541: // Message packing of uParam and lParam have changed for Win32, let us ! 2542: // handle the differences in a conditional compilation: ! 2543: ! 2544: wmId = LOWORD(uParam); ! 2545: wmEvent = HIWORD(uParam); ! 2546: ! 2547: switch (wmId) { ! 2548: ! 2549: case IDC_ATCOMMANDS: ! 2550: ! 2551: if ( LBN_DBLCLK == wmEvent ) { ! 2552: ! 2553: if ( IsWindowEnabled( GetDlgItem( hWnd, IDC_CHANGE ) ) ) { ! 2554: ! 2555: PostMessage( hWnd, WM_COMMAND, IDC_CHANGE, 0 ); ! 2556: ! 2557: } ! 2558: ! 2559: } ! 2560: ! 2561: break; ! 2562: ! 2563: case IDC_REFRESH: ! 2564: ! 2565: if ( Refresh( REFRESH_QUERY ) == TRUE ) { ! 2566: ! 2567: Refresh( REFRESH_FALSE ); ! 2568: ! 2569: hCursorOld = SetCursor( hCursorWait ); ! 2570: ! 2571: status = JobEnum( lParam ); ! 2572: ! 2573: SetCursor( hCursorOld ); ! 2574: ! 2575: if ( status == NERR_Success || status == ERROR_SUCCESS ) { ! 2576: ! 2577: Refresh( REFRESH_TRUE ); ! 2578: ! 2579: } ! 2580: ! 2581: } ! 2582: ! 2583: break; ! 2584: ! 2585: case IDC_ADD: ! 2586: ! 2587: Refresh( REFRESH_FALSE ); ! 2588: ! 2589: lpAddChangeDlgProc = MakeProcInstance((FARPROC)AddChangeDlgProc, hInstance); ! 2590: ! 2591: iDlgRetCode = DialogBoxParam( ! 2592: hInst, ! 2593: "ADDCHANGEDLG", ! 2594: hWnd, ! 2595: (DLGPROC)lpAddChangeDlgProc, ! 2596: IDC_ADD); ! 2597: ! 2598: hGlobalAddChg = NULL; ! 2599: ! 2600: FreeProcInstance(lpAddChangeDlgProc); ! 2601: FreeProcInstance(lpAmPmProc); ! 2602: FreeProcInstance(lpAmPmDefProc); ! 2603: FreeProcInstance(lpHourProc); ! 2604: FreeProcInstance(lpHourDefProc); ! 2605: FreeProcInstance(lpMinProc); ! 2606: FreeProcInstance(lpMinDefProc); ! 2607: FreeProcInstance(lpDownButtonProc); ! 2608: FreeProcInstance(lpDownButtonDefProc); ! 2609: FreeProcInstance(lpUpButtonProc); ! 2610: FreeProcInstance(lpUpButtonDefProc); ! 2611: ! 2612: Refresh( REFRESH_TRUE ); ! 2613: ! 2614: if ( iDlgRetCode == IDOK ) { ! 2615: ! 2616: SendMessage( hWnd, WM_COMMAND, IDC_REFRESH, (LPARAM)SCS_BOTTOM ); ! 2617: ! 2618: } ! 2619: ! 2620: break; ! 2621: ! 2622: case IDC_CHANGE: ! 2623: ! 2624: Refresh( REFRESH_FALSE ); ! 2625: ! 2626: lpAddChangeDlgProc = MakeProcInstance((FARPROC)AddChangeDlgProc, hInstance); ! 2627: ! 2628: iDlgRetCode = DialogBoxParam( ! 2629: hInst, ! 2630: "ADDCHANGEDLG", ! 2631: hWnd, ! 2632: (DLGPROC)lpAddChangeDlgProc, ! 2633: IDC_CHANGE); ! 2634: ! 2635: hGlobalAddChg = NULL; ! 2636: ! 2637: FreeProcInstance(lpAddChangeDlgProc); ! 2638: FreeProcInstance(lpAmPmProc); ! 2639: FreeProcInstance(lpAmPmDefProc); ! 2640: FreeProcInstance(lpHourProc); ! 2641: FreeProcInstance(lpHourDefProc); ! 2642: FreeProcInstance(lpMinProc); ! 2643: FreeProcInstance(lpMinDefProc); ! 2644: FreeProcInstance(lpDownButtonProc); ! 2645: FreeProcInstance(lpDownButtonDefProc); ! 2646: FreeProcInstance(lpUpButtonProc); ! 2647: FreeProcInstance(lpUpButtonDefProc); ! 2648: ! 2649: Refresh( REFRESH_TRUE ); ! 2650: ! 2651: if ( iDlgRetCode == IDOK ) { ! 2652: ! 2653: SendMessage( hWnd, WM_COMMAND, IDC_REFRESH, (LPARAM)SCS_BOTTOM ); ! 2654: ! 2655: } ! 2656: ! 2657: break; ! 2658: ! 2659: case IDC_REMOVE: ! 2660: ! 2661: status = JobDel( DEL_ID, hWnd ); ! 2662: ! 2663: break; ! 2664: ! 2665: case IDM_GET_FROM_REGISTRY: ! 2666: ! 2667: RegCreateKeyEx(REG_HKEY, ! 2668: szRegistryPath, ! 2669: 0, ! 2670: "", ! 2671: REG_OPTION_NON_VOLATILE, ! 2672: KEY_ALL_ACCESS, ! 2673: NULL, ! 2674: &hkHandle, ! 2675: &dwDisposition); ! 2676: ! 2677: if ( dwDisposition == REG_CREATED_NEW_KEY ) { ! 2678: ! 2679: RegSetValueEx(hkHandle, "dwX", 0, REG_DWORD, (LPBYTE)DWX, sizeof(DWORD)); ! 2680: RegSetValueEx(hkHandle, "dwY", 0, REG_DWORD, (LPBYTE)DWY, sizeof(DWORD)); ! 2681: ! 2682: } ! 2683: ! 2684: { ! 2685: DWORD dwType = REG_DWORD; ! 2686: DWORD dwSize = sizeof(DWORD); ! 2687: ! 2688: RegQueryValueEx(hkHandle, "dwX", 0, &dwType, (LPBYTE)&dwX, &dwSize); ! 2689: RegQueryValueEx(hkHandle, "dwY", 0, &dwType, (LPBYTE)&dwY, &dwSize); ! 2690: ! 2691: } ! 2692: ! 2693: RegCloseKey(hkHandle); ! 2694: ! 2695: { ! 2696: RECT Rect; ! 2697: ! 2698: if(!GetWindowRect(hWnd, &Rect)) { ! 2699: ! 2700: MessageBox( ! 2701: hWnd, ! 2702: "Problem getting window coordinates.", ! 2703: SZWINDOWTITLE, ! 2704: MB_OK | MB_ICONEXCLAMATION ! 2705: ); ! 2706: ! 2707: } else { ! 2708: ! 2709: dwW = Rect.right - Rect.left; ! 2710: dwH = Rect.bottom - Rect.top; ! 2711: ! 2712: } ! 2713: ! 2714: } ! 2715: ! 2716: MoveWindow(hWnd, (INT)dwX, (INT)dwY, (INT)dwW, (INT)dwH, TRUE); ! 2717: ! 2718: break; ! 2719: ! 2720: case IDM_SAVE_TO_REGISTRY: ! 2721: ! 2722: RegCreateKeyEx(REG_HKEY, ! 2723: szRegistryPath, ! 2724: 0, ! 2725: "", ! 2726: REG_OPTION_NON_VOLATILE, ! 2727: KEY_ALL_ACCESS, ! 2728: NULL, ! 2729: &hkHandle, ! 2730: &dwDisposition ! 2731: ); ! 2732: ! 2733: { ! 2734: RECT Rect; ! 2735: ! 2736: if(!GetWindowRect(hWnd, &Rect)) { ! 2737: ! 2738: dwX = DWX; ! 2739: dwY = DWY; ! 2740: ! 2741: MessageBox( ! 2742: hWnd, ! 2743: "Problem getting coordinates.", ! 2744: SZWINDOWTITLE, ! 2745: MB_OK | MB_ICONEXCLAMATION ! 2746: ); ! 2747: ! 2748: } else { ! 2749: ! 2750: dwX = Rect.left; ! 2751: dwY = Rect.top; ! 2752: ! 2753: } ! 2754: ! 2755: } ! 2756: ! 2757: RegSetValueEx(hkHandle, "dwX", 0, REG_DWORD, (LPBYTE)&dwX, sizeof(DWORD)); ! 2758: RegSetValueEx(hkHandle, "dwY", 0, REG_DWORD, (LPBYTE)&dwY, sizeof(DWORD)); ! 2759: ! 2760: RegCloseKey(hkHandle); ! 2761: ! 2762: break; ! 2763: ! 2764: case IDM_ABOUT: ! 2765: ! 2766: Refresh( REFRESH_SAVE ); ! 2767: Refresh( REFRESH_FALSE ); ! 2768: ! 2769: if ( ShellAbout( hGlobalhWnd, SZWINDOWTITLE, SZCREDITS, LoadIcon( hInst, (LPSTR)SZAPPTITLE ) ) == -1 ) { ! 2770: ! 2771: MessageBox( hGlobalhWnd, "Out of memory error.", SZWINDOWTITLE, MB_OK | MB_ICONEXCLAMATION ); ! 2772: ! 2773: } ! 2774: ! 2775: Refresh( REFRESH_RESTORE ); ! 2776: ! 2777: break; ! 2778: ! 2779: case IDM_SELECTCOMPUTER: ! 2780: ! 2781: Refresh( REFRESH_SAVE ); ! 2782: Refresh( REFRESH_FALSE ); ! 2783: ! 2784: lpProcSelect = MakeProcInstance((FARPROC)SelectComputerProc, hInst); ! 2785: ! 2786: iDlgRetCode = DialogBox(hInst, ! 2787: "SelectComputer", ! 2788: hWnd, ! 2789: (DLGPROC)lpProcSelect); ! 2790: ! 2791: FreeProcInstance(lpProcSelect); ! 2792: ! 2793: Refresh( REFRESH_TRUE ); ! 2794: ! 2795: if ( iDlgRetCode == IDOK ) { ! 2796: ! 2797: SendMessage( hWnd, WM_COMMAND, IDC_REFRESH, (LPARAM)SCS_TOP ); ! 2798: ! 2799: } ! 2800: ! 2801: break; ! 2802: ! 2803: case IDM_EXIT: ! 2804: ! 2805: Refresh( REFRESH_FALSE ); ! 2806: FFreeListboxExtents( GetDlgItem( hWnd, IDC_ATCOMMANDS ) ); ! 2807: ShowWindow( hWnd, SW_RESTORE ); ! 2808: SendMessage( hWnd, WM_COMMAND, IDM_SAVE_TO_REGISTRY, 0 ); ! 2809: DeleteObject( hFont ); ! 2810: KillTimer( hWnd, 1 ); ! 2811: EndDialog( hWnd, 0 ); ! 2812: ! 2813: break; ! 2814: ! 2815: case IDC_HELP: ! 2816: ! 2817: if (!WinHelp (hWnd, "WINAT.HLP", HELP_KEY,(DWORD)(LPSTR)"CONTENTS")) { ! 2818: MessageBox (GetFocus(), ! 2819: "Unable to activate help", ! 2820: SZWINDOWTITLE, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); ! 2821: } ! 2822: break; ! 2823: ! 2824: case IDM_HELPCONTENTS: ! 2825: ! 2826: if (!WinHelp (hWnd, "WINAT.HLP", HELP_KEY,(DWORD)(LPSTR)"CONTENTS")) { ! 2827: MessageBox (GetFocus(), ! 2828: "Unable to activate help", ! 2829: SZWINDOWTITLE, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); ! 2830: } ! 2831: ! 2832: break; ! 2833: ! 2834: case IDM_HELPSEARCH: ! 2835: ! 2836: if (!WinHelp(hWnd, "WINAT.HLP", HELP_PARTIALKEY, (DWORD)(LPSTR)"")) { ! 2837: MessageBox (GetFocus(), ! 2838: "Unable to activate help", ! 2839: SZWINDOWTITLE, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); ! 2840: } ! 2841: ! 2842: break; ! 2843: ! 2844: case IDM_HELPHELP: ! 2845: ! 2846: if(!WinHelp(hWnd, (LPSTR)NULL, HELP_HELPONHELP, 0)) { ! 2847: MessageBox (GetFocus(), ! 2848: "Unable to activate help", ! 2849: SZWINDOWTITLE, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); ! 2850: } ! 2851: ! 2852: break; ! 2853: ! 2854: } ! 2855: ! 2856: break; ! 2857: ! 2858: case WM_CLOSE: ! 2859: case WM_ENDSESSION: ! 2860: ! 2861: SendMessage(hWnd, WM_COMMAND, IDM_EXIT, 0); ! 2862: ! 2863: break; ! 2864: ! 2865: } ! 2866: ! 2867: return (0); ! 2868: ! 2869: } ! 2870: ! 2871: ! 2872: ! 2873: //=========================================================================== ! 2874: // FUNCTION: WinMain() ! 2875: //=========================================================================== ! 2876: int APIENTRY WinMain( ! 2877: HANDLE hInstance, ! 2878: HANDLE hPrevInstance, ! 2879: LPSTR lpCmdLine, ! 2880: int nCmdShow) ! 2881: { ! 2882: ! 2883: FARPROC lpWINATDlgProc; ! 2884: WNDCLASS wc; ! 2885: ! 2886: hInst = hInstance; ! 2887: ! 2888: // Fill in window class structure with parameters that describe the ! 2889: // main window. ! 2890: ! 2891: wc.style = CS_HREDRAW | CS_VREDRAW; ! 2892: wc.lpfnWndProc = (WNDPROC)DefDlgProc; ! 2893: wc.cbClsExtra = 0; ! 2894: wc.cbWndExtra = DLGWINDOWEXTRA; ! 2895: wc.hInstance = hInstance; ! 2896: wc.hIcon = LoadIcon (hInstance, szAppName); ! 2897: wc.hCursor = LoadCursor(NULL, IDC_ARROW); ! 2898: wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); ! 2899: wc.lpszMenuName = szAppName; ! 2900: wc.lpszClassName = szAppName; ! 2901: ! 2902: // Register the window class ! 2903: ! 2904: RegisterClass(&wc); ! 2905: ! 2906: ! 2907: // ! 2908: // this program is only a single dialog box ! 2909: // ! 2910: ! 2911: lpWINATDlgProc = MakeProcInstance((FARPROC)WINATDlgProc, hInstance); ! 2912: ! 2913: DialogBox(hInstance, ! 2914: "WINATDLG", ! 2915: 0, ! 2916: (DLGPROC)lpWINATDlgProc ! 2917: ); ! 2918: ! 2919: FreeProcInstance(lpWINATDlgProc); ! 2920: ! 2921: return 0; ! 2922: ! 2923: } ! 2924:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.