|
|
1.1 ! root 1: ! 2: #include <windows.h> ! 3: #include <winspool.h> ! 4: #include <winsplp.h> ! 5: #include <stdlib.h> ! 6: #include <stdio.h> ! 7: #include "spltypes.h" ! 8: #include "local.h" ! 9: #include "dialogs.h" ! 10: ! 11: WCHAR szWindows[] = L"windows"; ! 12: WCHAR szINIKey_TransmissionRetryTimeout[] = L"TransmissionRetryTimeout"; ! 13: WCHAR szHelpFile[] = L"PRINTMAN.HLP"; ! 14: ! 15: #define ID_HELP_PORTNAME 2200 ! 16: #define ID_HELP_CONFIGURE_LPT 2300 ! 17: #define ID_HELP_PRINTTOFILE 2400 ! 18: ! 19: /* Use the window word of the entry field to store last valid entry: ! 20: */ ! 21: #define SET_LAST_VALID_ENTRY( hwnd, id, val ) \ ! 22: SetWindowLong( GetDlgItem( hwnd, id ), GWL_USERDATA, (LONG)val ) ! 23: #define GET_LAST_VALID_ENTRY( hwnd, id ) \ ! 24: GetWindowLong( GetDlgItem( hwnd, id ), GWL_USERDATA ) ! 25: ! 26: /* Local functions: ! 27: */ ! 28: BOOL ! 29: PortNameInitDialog( ! 30: HWND hwnd, ! 31: LPWSTR *ppPortName ! 32: ); ! 33: BOOL ! 34: PortNameCommandOK( ! 35: HWND hwnd ! 36: ); ! 37: BOOL ! 38: PortNameCommandCancel( ! 39: HWND hwnd ! 40: ); ! 41: BOOL ! 42: PortIsValid( ! 43: LPWSTR pPortName ! 44: ); ! 45: ! 46: BOOL ! 47: ConfigureLPTPortInitDialog( ! 48: HWND hwnd ! 49: ); ! 50: ! 51: BOOL ! 52: ConfigureLPTPortCommandOK( ! 53: HWND hwnd ! 54: ); ! 55: ! 56: BOOL ! 57: ConfigureLPTPortCommandCancel( ! 58: HWND hwnd ! 59: ); ! 60: ! 61: BOOL ! 62: ConfigureLPTPortCommandTransmissionRetryUpdate( ! 63: HWND hwnd, ! 64: WORD CtlId ! 65: ); ! 66: ! 67: BOOL ! 68: PrintToFileInitDialog( ! 69: HWND hwnd, ! 70: PHANDLE phFile ! 71: ); ! 72: ! 73: BOOL ! 74: PrintToFileCommandOK( ! 75: HWND hwnd ! 76: ); ! 77: ! 78: BOOL ! 79: PrintToFileCommandCancel( ! 80: HWND hwnd ! 81: ); ! 82: ! 83: VOID ! 84: CreateMessageHook( ! 85: HWND hwnd ! 86: ); ! 87: ! 88: VOID ! 89: FreeMessageHook( ! 90: HWND hwnd ! 91: ); ! 92: ! 93: LRESULT ! 94: CALLBACK ! 95: MessageProc( ! 96: int Code, ! 97: WPARAM wParam, ! 98: LPARAM lParam ! 99: ); ! 100: ! 101: ! 102: UINT WM_Help = 0; ! 103: ! 104: ! 105: /* ! 106: * ! 107: */ ! 108: BOOL APIENTRY ! 109: PortNameDlg( ! 110: HWND hwnd, ! 111: WORD msg, ! 112: WPARAM wparam, ! 113: LPARAM lparam ! 114: ) ! 115: { ! 116: switch(msg) ! 117: { ! 118: case WM_INITDIALOG: ! 119: return PortNameInitDialog(hwnd, (LPWSTR *)lparam); ! 120: ! 121: case WM_COMMAND: ! 122: switch (LOWORD(wparam)) ! 123: { ! 124: case IDOK: ! 125: return PortNameCommandOK(hwnd); ! 126: ! 127: case IDCANCEL: ! 128: return PortNameCommandCancel(hwnd); ! 129: ! 130: case IDD_PN_PB_HELP: ! 131: WinHelp(hwnd, szHelpFile, HELP_CONTEXT, ID_HELP_PORTNAME); ! 132: } ! 133: break; ! 134: ! 135: case WM_DESTROY: ! 136: FreeMessageHook(hwnd); ! 137: break; ! 138: } ! 139: ! 140: if( msg == WM_Help ) ! 141: WinHelp(hwnd, szHelpFile, HELP_CONTEXT, ID_HELP_PORTNAME); ! 142: ! 143: return FALSE; ! 144: } ! 145: ! 146: ! 147: /* ! 148: * ! 149: */ ! 150: BOOL ! 151: PortNameInitDialog( ! 152: HWND hwnd, ! 153: LPWSTR *ppPortName ! 154: ) ! 155: { ! 156: SetForegroundWindow(hwnd); ! 157: ! 158: SetWindowLong (hwnd, GWL_USERDATA, (LONG)ppPortName); ! 159: SendDlgItemMessage (hwnd, IDD_PN_EF_PORTNAME, EM_LIMITTEXT, MAX_PATH, 0); ! 160: ! 161: CreateMessageHook( hwnd ); ! 162: ! 163: return TRUE; ! 164: } ! 165: ! 166: ! 167: /* ! 168: * ! 169: */ ! 170: BOOL ! 171: PortNameCommandOK( ! 172: HWND hwnd ! 173: ) ! 174: { ! 175: LPWSTR *ppPortName; ! 176: WCHAR string[MAX_PATH]; ! 177: ! 178: ppPortName = (LPWSTR *)GetWindowLong( hwnd, GWL_USERDATA ); ! 179: ! 180: GetDlgItemText( hwnd, IDD_PN_EF_PORTNAME, string, sizeof string ); ! 181: ! 182: if( PortIsValid( string ) ) ! 183: { ! 184: EnterSplSem( ); ! 185: *ppPortName = AllocSplStr( string ); ! 186: LeaveSplSem( ); ! 187: EndDialog( hwnd, TRUE ); ! 188: } ! 189: else ! 190: Message( hwnd, MSG_ERROR, IDS_LOCALMONITOR, IDS_INVALIDPORTNAME_S, string ); ! 191: ! 192: return TRUE; ! 193: } ! 194: ! 195: ! 196: ! 197: /* ! 198: * ! 199: */ ! 200: BOOL ! 201: PortNameCommandCancel( ! 202: HWND hwnd ! 203: ) ! 204: { ! 205: EndDialog( hwnd, FALSE ); ! 206: return TRUE; ! 207: } ! 208: ! 209: ! 210: ! 211: /* PortIsValid ! 212: * ! 213: * Validate the port by attempting to create/open it. ! 214: */ ! 215: BOOL ! 216: PortIsValid( ! 217: LPWSTR pPortName ! 218: ) ! 219: { ! 220: HANDLE hFile; ! 221: BOOL Valid; ! 222: ! 223: hFile = CreateFile( pPortName, GENERIC_WRITE, FILE_SHARE_READ, NULL, ! 224: OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); ! 225: ! 226: if( hFile != (HANDLE)-1 ) ! 227: { ! 228: CloseHandle( hFile ); ! 229: ! 230: Valid = TRUE; ! 231: } ! 232: else ! 233: Valid = FALSE; ! 234: ! 235: return Valid; ! 236: } ! 237: ! 238: ! 239: ! 240: /* ! 241: * ! 242: */ ! 243: BOOL APIENTRY ! 244: ConfigureLPTPortDlg( ! 245: HWND hwnd, ! 246: WORD msg, ! 247: WPARAM wparam, ! 248: LPARAM lparam ! 249: ) ! 250: { ! 251: switch(msg) ! 252: { ! 253: case WM_INITDIALOG: ! 254: return ConfigureLPTPortInitDialog(hwnd); ! 255: ! 256: case WM_COMMAND: ! 257: switch (LOWORD(wparam)) ! 258: { ! 259: case IDOK: ! 260: return ConfigureLPTPortCommandOK(hwnd); ! 261: ! 262: case IDCANCEL: ! 263: return ConfigureLPTPortCommandCancel(hwnd); ! 264: ! 265: case IDD_CL_EF_TRANSMISSIONRETRY: ! 266: if( HIWORD(wparam) == EN_UPDATE ) ! 267: ConfigureLPTPortCommandTransmissionRetryUpdate(hwnd, LOWORD(wparam)); ! 268: break; ! 269: ! 270: case IDD_CF_PB_HELP: ! 271: WinHelp(hwnd, szHelpFile, HELP_CONTEXT, ID_HELP_CONFIGURE_LPT); ! 272: } ! 273: break; ! 274: ! 275: case WM_DESTROY: ! 276: FreeMessageHook(hwnd); ! 277: break; ! 278: } ! 279: ! 280: if( msg == WM_Help ) ! 281: WinHelp(hwnd, szHelpFile, HELP_CONTEXT, ID_HELP_CONFIGURE_LPT); ! 282: ! 283: return FALSE; ! 284: } ! 285: ! 286: ! 287: /* ! 288: * ! 289: */ ! 290: BOOL ! 291: ConfigureLPTPortInitDialog( ! 292: HWND hwnd ! 293: ) ! 294: { ! 295: DWORD TransmissionRetryTimeout; ! 296: ! 297: SetForegroundWindow(hwnd); ! 298: ! 299: SendDlgItemMessage( hwnd, IDD_CL_EF_TRANSMISSIONRETRY, ! 300: EM_LIMITTEXT, TIMEOUT_STRING_MAX, 0 ); ! 301: ! 302: TransmissionRetryTimeout = GetProfileInt( szWindows, ! 303: szINIKey_TransmissionRetryTimeout, ! 304: 45 ); ! 305: SetDlgItemInt( hwnd, IDD_CL_EF_TRANSMISSIONRETRY, ! 306: TransmissionRetryTimeout, FALSE ); ! 307: ! 308: SET_LAST_VALID_ENTRY( hwnd, IDD_CL_EF_TRANSMISSIONRETRY, ! 309: TransmissionRetryTimeout ); ! 310: ! 311: CreateMessageHook( hwnd ); ! 312: ! 313: return TRUE; ! 314: } ! 315: ! 316: ! 317: /* ! 318: * ! 319: */ ! 320: BOOL ! 321: ConfigureLPTPortCommandOK( ! 322: HWND hwnd ! 323: ) ! 324: { ! 325: WCHAR String[TIMEOUT_STRING_MAX+1]; ! 326: UINT TransmissionRetryTimeout; ! 327: BOOL bTranslated; ! 328: ! 329: TransmissionRetryTimeout = GetDlgItemInt( hwnd, ! 330: IDD_CL_EF_TRANSMISSIONRETRY, ! 331: &bTranslated, ! 332: FALSE ); ! 333: ! 334: wsprintf(String, L"%d", TransmissionRetryTimeout); ! 335: ! 336: WriteProfileString( szWindows, szINIKey_TransmissionRetryTimeout, ! 337: String ); ! 338: ! 339: EndDialog( hwnd, TRUE ); ! 340: ! 341: return TRUE; ! 342: } ! 343: ! 344: ! 345: ! 346: /* ! 347: * ! 348: */ ! 349: BOOL ! 350: ConfigureLPTPortCommandCancel( ! 351: HWND hwnd ! 352: ) ! 353: { ! 354: EndDialog(hwnd, FALSE); ! 355: return TRUE; ! 356: } ! 357: ! 358: ! 359: /* ! 360: * ! 361: */ ! 362: BOOL ! 363: ConfigureLPTPortCommandTransmissionRetryUpdate( ! 364: HWND hwnd, ! 365: WORD CtlId ! 366: ) ! 367: { ! 368: int Value; ! 369: BOOL OK; ! 370: ! 371: Value = GetDlgItemInt( hwnd, CtlId, &OK, FALSE ); ! 372: ! 373: if( WITHINRANGE( Value, TIMEOUT_MIN, TIMEOUT_MAX ) ) ! 374: { ! 375: SET_LAST_VALID_ENTRY( hwnd, CtlId, Value ); ! 376: } ! 377: ! 378: else ! 379: { ! 380: SetDlgItemInt( hwnd, CtlId, GET_LAST_VALID_ENTRY( hwnd, CtlId ), FALSE ); ! 381: SendDlgItemMessage( hwnd, CtlId, EM_SETSEL, 0, (LPARAM)-1 ); ! 382: } ! 383: ! 384: return TRUE; ! 385: } ! 386: ! 387: ! 388: /* ! 389: * ! 390: */ ! 391: BOOL APIENTRY ! 392: PrintToFileDlg( ! 393: HWND hwnd, ! 394: WORD msg, ! 395: WPARAM wparam, ! 396: LPARAM lparam ! 397: ) ! 398: { ! 399: switch(msg) ! 400: { ! 401: case WM_INITDIALOG: ! 402: return PrintToFileInitDialog(hwnd, (PHANDLE)lparam); ! 403: ! 404: case WM_COMMAND: ! 405: switch (LOWORD(wparam)) ! 406: { ! 407: case IDOK: ! 408: return PrintToFileCommandOK(hwnd); ! 409: ! 410: case IDCANCEL: ! 411: return PrintToFileCommandCancel(hwnd); ! 412: ! 413: case IDD_PF_PB_HELP: ! 414: WinHelp(hwnd, szHelpFile, HELP_CONTEXT, ID_HELP_PRINTTOFILE); ! 415: } ! 416: break; ! 417: ! 418: case WM_DESTROY: ! 419: FreeMessageHook(hwnd); ! 420: break; ! 421: } ! 422: ! 423: if( msg == WM_Help ) ! 424: WinHelp(hwnd, szHelpFile, HELP_CONTEXT, ID_HELP_PRINTTOFILE); ! 425: ! 426: return FALSE; ! 427: } ! 428: ! 429: ! 430: /* ! 431: * ! 432: */ ! 433: BOOL ! 434: PrintToFileInitDialog( ! 435: HWND hwnd, ! 436: PHANDLE phFile ! 437: ) ! 438: { ! 439: // SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, ! 440: // SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); ! 441: ! 442: BringWindowToTop( hwnd ); ! 443: ! 444: SetFocus(hwnd); ! 445: ! 446: SetWindowLong( hwnd, GWL_USERDATA, (LONG)phFile ); ! 447: ! 448: SendDlgItemMessage( hwnd, IDD_PF_EF_OUTPUTFILENAME, EM_LIMITTEXT, MAX_PATH, 0); ! 449: ! 450: CreateMessageHook( hwnd ); ! 451: ! 452: return TRUE; ! 453: } ! 454: ! 455: ! 456: /* ! 457: * ! 458: */ ! 459: BOOL ! 460: PrintToFileCommandOK( ! 461: HWND hwnd ! 462: ) ! 463: { ! 464: WCHAR pFileName[MAX_PATH]; ! 465: WIN32_FIND_DATA FindData; ! 466: PHANDLE phFile; ! 467: HANDLE hFile; ! 468: HANDLE hFind; ! 469: ! 470: phFile = (PHANDLE)GetWindowLong( hwnd, GWL_USERDATA ); ! 471: ! 472: GetDlgItemText( hwnd, IDD_PF_EF_OUTPUTFILENAME, ! 473: pFileName, MAX_PATH ); ! 474: ! 475: hFind = FindFirstFile( pFileName, &FindData ); ! 476: ! 477: /* If the file already exists, get the user to verify ! 478: * before we overwrite it: ! 479: */ ! 480: if( hFind != INVALID_HANDLE_VALUE ) ! 481: { ! 482: FindClose( hFind ); ! 483: ! 484: if( Message( hwnd, MSG_CONFIRMATION, IDS_LOCALMONITOR, ! 485: IDS_OVERWRITE_EXISTING_FILE ) ! 486: != IDOK ) ! 487: { ! 488: return TRUE; ! 489: } ! 490: } ! 491: ! 492: ! 493: hFile = CreateFile( pFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, ! 494: OPEN_ALWAYS, ! 495: FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, ! 496: NULL ); ! 497: ! 498: if( hFile == INVALID_HANDLE_VALUE ) ! 499: { ! 500: ReportError( hwnd, IDS_LOCALMONITOR, IDS_COULD_NOT_OPEN_FILE ); ! 501: } ! 502: ! 503: else ! 504: { ! 505: *phFile = hFile; ! 506: EndDialog( hwnd, TRUE ); ! 507: } ! 508: ! 509: return TRUE; ! 510: } ! 511: ! 512: ! 513: ! 514: /* ! 515: * ! 516: */ ! 517: BOOL ! 518: PrintToFileCommandCancel( ! 519: HWND hwnd ! 520: ) ! 521: { ! 522: EndDialog(hwnd, FALSE); ! 523: return TRUE; ! 524: } ! 525: ! 526: ! 527: /* The hook handle will be stored in the DWL_USER reserved ! 528: * storage of the dialog box. ! 529: */ ! 530: #ifdef USER_BUG_10019 /* DWL_USER is being treated as GWL_USERDATA */ ! 531: ! 532: #define SETHOOK( hwnd, hhook ) SetWindowLong( hwnd, DWL_USER, (LONG)hhook ) ! 533: #define GETHOOK( hwnd ) (HHOOK)GetWindowLong( hwnd, DWL_USER ) ! 534: ! 535: #else ! 536: ! 537: HHOOK hGlobalHook; ! 538: #define SETHOOK( hwnd, hhook ) hGlobalHook = hhook ! 539: #define GETHOOK( hwnd ) hGlobalHook ! 540: ! 541: #endif /* USER_BUG_10019 */ ! 542: ! 543: /* Create a message hook for the current thread. ! 544: * Since these dialogs are running on separate threads, ! 545: * it is necessary to create one each time, and to clean ! 546: * up afterwards. ! 547: * Also ensures that WM_Help is defined. This need be done ! 548: * only once. ! 549: */ ! 550: VOID CreateMessageHook( HWND hwnd ) ! 551: { ! 552: HHOOK hhook; ! 553: ! 554: if( !WM_Help ) ! 555: WM_Help = RegisterWindowMessage( L"Print Manager Help Message" ); ! 556: ! 557: hhook = SetWindowsHookEx( WH_MSGFILTER, MessageProc, hInst, ! 558: GetCurrentThreadId( ) ); ! 559: ! 560: SETHOOK( hwnd, hhook ); ! 561: } ! 562: ! 563: ! 564: /* ! 565: * ! 566: */ ! 567: VOID FreeMessageHook( HWND hwnd ) ! 568: { ! 569: UnhookWindowsHookEx( GETHOOK( hwnd ) ); ! 570: } ! 571: ! 572: ! 573: /* ! 574: * ! 575: */ ! 576: HWND GetRealParent( HWND hwnd ) ! 577: { ! 578: // run up the parent chain until you find a hwnd ! 579: // that doesn't have WS_CHILD set ! 580: ! 581: while( GetWindowLong( hwnd, GWL_STYLE ) & WS_CHILD ) ! 582: hwnd = (HWND)GetWindowLong( hwnd, GWL_HWNDPARENT ); ! 583: ! 584: return hwnd; ! 585: } ! 586: ! 587: ! 588: /* MessageProc ! 589: * ! 590: * This is the callback routine which hooks F1 keypresses in dialogs. ! 591: * ! 592: * Any such message will be repackaged as a WM_Help message and sent to the dialog. ! 593: * ! 594: * See the Win32 API programming reference for a description of how this ! 595: * routine works. ! 596: * ! 597: * Andrew Bell (andrewbe) - 2 September 1992 ! 598: * This variation for localmon - 3 February 1993 ! 599: */ ! 600: LRESULT CALLBACK MessageProc( int Code, WPARAM wParam, LPARAM lParam ) ! 601: { ! 602: PMSG pMsg = (PMSG)lParam; ! 603: HWND hwndDlg; ! 604: ! 605: hwndDlg = GetRealParent( pMsg->hwnd ); ! 606: ! 607: if( Code < 0 ) ! 608: return CallNextHookEx( GETHOOK( hwndDlg ), Code, wParam, lParam ); ! 609: ! 610: switch( Code ) ! 611: { ! 612: case MSGF_DIALOGBOX: ! 613: if( ( pMsg->message == WM_KEYDOWN ) && ( pMsg->wParam == VK_F1 ) ) ! 614: { ! 615: PostMessage( hwndDlg, WM_Help, (WPARAM)pMsg->hwnd, 0 ); ! 616: return 1; ! 617: } ! 618: break; ! 619: } ! 620: ! 621: return 0; ! 622: } ! 623: ! 624:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.