|
|
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.