source: trunk/dll/printer.c

Last change on this file was 1859, checked in by John Small, 5 years ago

Corrected typo in previous comment.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 18.2 KB
Line 
1/***********************************************************************
2
3  $Id: printer.c 1859 2015-08-21 15:59:51Z jbs $
4
5  Print file list
6
7  Copyright (c) 1993-98 M. Kimes
8  Copyright (c) 2004, 2010 Steven H.Levine
9
10  01 Aug 04 SHL Rework lstrip/rstrip usage
11  17 Jul 06 SHL Use Runtime_Error
12  03 Nov 06 SHL Renames
13  03 Nov 06 SHL Count thread usage
14  22 Mar 07 GKY Use QWL_USER
15  20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
16  07 Feb 09 GKY Allow user to turn off alert and/or error beeps in settings notebook.
17  17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
18  12 Aug 15 JBS Ticket #522: Ensure no "highmem-unsafe" functions are called directly
19                Calls to unsafe Dos... functions have been changed to call the wrapped xDos... functions
20
21***********************************************************************/
22
23#include <stdlib.h>
24#include <string.h>
25#include <ctype.h>
26#include <share.h>
27
28#define INCL_DOS
29#define INCL_WIN
30#define INCL_LONGLONG                   // dircnrs.h
31
32#include "fm3dll.h"
33#include "fm3dll2.h"                    // #define's for UM_*, control id's, etc.
34#include "notebook.h"                   // Data declaration(s)
35#include "mainwnd.h"                    // Data declaration(s)
36#include "init.h"                       // Data declaration(s)
37#include "fm3dlg.h"
38#include "fm3str.h"
39#include "makelist.h"                   // AddToList
40#include "errutil.h"                    // Dos_Error...
41#include "strutil.h"                    // GetPString
42#include "notify.h"                     // AddNote
43#include "defview.h"                    // QuickView
44#include "printer.h"
45#include "common.h"                     // DecrThreadUsage, IncrThreadUsage
46#include "chklist.h"                    // PosOverOkay
47#include "strips.h"                     // bstrip
48#include "valid.h"                      // IsFile
49#include "wrappers.h"                   // xfopen
50#include "misc.h"                       // PostMsg
51#include "fortify.h"
52
53// Data definitions
54#pragma data_seg(DATA1)
55
56static PSZ pszSrcFile = __FILE__;
57
58static HMTX PrintSem = 0;
59
60static BOOL PrinterReady(CHAR * printdevname);
61static BOOL SayPrinterReady(HWND hwnd);
62
63#pragma data_seg(GLOBAL2)
64CHAR StopPrinting;
65CHAR printer[CCHMAXPATH];
66BOOL prnalt;
67long prnbmargin;
68BOOL prnformat;
69BOOL prnformfeedafter;
70BOOL prnformfeedbefore;
71long prnlength;
72long prnlmargin;
73BOOL prnpagenums;
74long prnrmargin;
75long prnspacing;
76long prntabspaces;
77long prntmargin;
78long prnwidth;
79
80BOOL PrinterReady(CHAR * printdevname)
81{
82  FILE *printhandle;
83  CHAR param = 0, data = 0;
84  ULONG datalen = 1, parmlen = 1, htype, flagword;
85  CHAR *modea = "a+";
86
87  if (!fWorkPlace)                      // assume spooler is active
88    return TRUE;
89  DosError(FERR_DISABLEHARDERR);
90  printhandle = xfopen(printdevname, modea, pszSrcFile, __LINE__, FALSE);
91  if (printhandle) {
92    if (!strnicmp(printdevname, "COM", 3) && isdigit(printdevname[3])) {
93      fclose(printhandle);
94      return TRUE;
95    }
96    if (!xDosQueryHType(fileno(printhandle), &htype, &flagword) &&
97        !(htype & 7)) {
98      fclose(printhandle);
99      return TRUE;
100    }
101    if (DosDevIOCtl(fileno(printhandle), 5, 0x00000066, (PVOID) & param,
102                    1, &parmlen, (PVOID) & data, 1,
103                    &datalen) != 0x00000100) {
104      fclose(printhandle);
105      return FALSE;
106    }
107    fclose(printhandle);
108    if (data & 32)                      // bit 5 is out of paper
109      return FALSE;
110    return TRUE;
111  }
112  return FALSE;
113}
114
115BOOL SayPrinterReady(HWND hwnd)
116{
117  if (!hwnd)
118    hwnd = HWND_DESKTOP;
119  if (!PrinterReady(printer)) {
120    saymsg(MB_ENTER | MB_ICONEXCLAMATION,
121           hwnd,
122           GetPString(IDS_NOTETEXT), GetPString(IDS_PRINTERNOTREADYTEXT));
123    return FALSE;
124  }
125  return TRUE;
126}
127
128//=== PrintListThread - background-print a list of files ===
129
130VOID PrintListThread(VOID * arg)
131{
132  HAB hab2;
133  HMQ hmq2;
134  LISTINFO *li = (LISTINFO *) arg;
135  register INT x;
136  FILE *fpi, *fpo;
137  CHAR s[CCHMAXPATH + 80];
138  FILESTATUS3 fs3;
139  LONG cols, lines, pages, z, lmargin, rmargin;
140  BOOL endline, endpage, startpage, skipping, firstpass;
141  int c;
142  APIRET rc = MBID_YES;
143  CHAR *mode;
144
145  if (StopPrinting)
146    goto Abort;
147  if (!PrintSem) {
148    if (DosCreateMutexSem(NULL, &PrintSem, 0, FALSE)) {
149      Dos_Error(MB_CANCEL, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
150                PCSZ_DOSCREATEMUTEXSEM);
151      goto Abort;
152    }
153  }
154# ifdef FORTIFY
155  Fortify_EnterScope();
156#  endif
157  priority_normal();
158  hab2 = WinInitialize(0);
159  if (hab2) {
160    hmq2 = WinCreateMsgQueue(hab2, 0);
161    if (hmq2) {
162      WinCancelShutdown(hmq2, TRUE);
163      IncrThreadUsage();
164      if (li && li->list && li->list[0]) {
165        AddNote(GetPString(IDS_PRINTINGLISTTEXT));
166        for (x = 0; li->list[x]; x++) {
167          if (rc == MBID_CANCEL)
168            break;
169          DosError(FERR_DISABLEHARDERR);
170          if (DosQueryPathInfo(li->list[x], FIL_STANDARD, &fs3, sizeof(fs3)) ||
171              fs3.attrFile & FILE_DIRECTORY ||
172              !fs3.cbFile)
173            continue;
174          if (StopPrinting)
175            break;
176          DosRequestMutexSem(PrintSem, 240000);
177          if (StopPrinting)
178            break;
179          if (!PrinterReady(li->targetpath))
180            Runtime_Error(pszSrcFile, __LINE__, "printer %s error",
181                          li->targetpath);
182          else {
183            mode = "r";
184            fpi = xfsopen(li->list[x], mode, SH_DENYWR, pszSrcFile, __LINE__, TRUE);
185            if (!fpi)
186              Runtime_Error(pszSrcFile, __LINE__, "cannot open %s",
187                            li->list[x]);
188            else {
189              mode = "a+";
190              fpo = xfsopen(li->targetpath, mode, SH_DENYRW, pszSrcFile, __LINE__, TRUE);
191              if (!fpo)
192                Runtime_Error(pszSrcFile, __LINE__, "cannot open %s",
193                              li->targetpath);
194              else {
195                sprintf(s, GetPString(IDS_PRINTINGTEXT), li->list[x]);
196                AddNote(s);
197                firstpass = TRUE;
198                skipping = FALSE;
199                lmargin = prnlmargin;
200                rmargin = prnrmargin;
201                if (prnformfeedbefore) {
202                  if (!skipping)
203                    fputc('\x0c', fpo);
204                }
205              Again:
206                cols = lines = pages = 0;
207                endline = endpage = FALSE;
208                startpage = TRUE;
209                while ((c = fgetc(fpi)) != EOF) {
210                  if (StopPrinting || ferror(fpo))
211                    break;
212                  if (prnformat) {
213                    if (startpage) {
214                      pages++;
215                      if (prnpagenums) {
216                        if (!skipping)
217                          fprintf(fpo, "%*.*s#%lu",
218                                  lmargin, lmargin, " ", pages);
219                      }
220                      for (z = 0; z < prntmargin; z++) {
221                        if (!skipping)
222                          fputc('\n', fpo);
223                      }
224                      lines = prntmargin;
225                      endline = endpage = FALSE;
226                      cols = 0;
227                      startpage = FALSE;
228                    }
229                    if (!cols) {
230                      for (z = 0; z < lmargin; z++) {
231                        if (!skipping)
232                          fputc(' ', fpo);
233                      }
234                      cols = lmargin;
235                    }
236                    if (!skipping) {
237                      if (c == '\t') {
238                        for (z = 0; z < prntabspaces &&
239                             cols + z < prnwidth - rmargin; z++)
240                          fputc(' ', fpo);
241                      }
242                      else
243                        fputc(c, fpo);
244                    }
245                    if (c == '\x0c')
246                      endpage = TRUE;
247                    else if (c == '\n') {
248                      lines++;
249                      cols = 0;
250                      for (z = 1; z < prnspacing; z++) {
251                        if (prnlength - lines <= prnbmargin)
252                          break;
253                        if (!skipping)
254                          fputc('\n', fpo);
255                        lines++;
256                      }
257                      if (prnlength - lines <= prnbmargin)
258                        endpage = TRUE;
259                    }
260                    else {
261                      cols++;
262                      if (c == '\t')
263                        c += prntabspaces;
264                      if (prnwidth - cols <= rmargin) {
265                        endline = TRUE;
266                        if (!skipping)
267                          fputc('\n', fpo);
268                        lines++;
269                      }
270                      for (z = 1; z < prnspacing; z++) {
271                        if (prnlength - lines <= prnbmargin)
272                          break;
273                        if (!skipping)
274                          fputc('\n', fpo);
275                        lines++;
276                      }
277                    }
278                    if (endline) {
279                      do {
280                        c = fgetc(fpi);
281                        if (c == '\n')
282                          break;
283                      } while (isspace(c) && c != EOF);
284                      if (c == EOF)
285                        break;
286                      if (!isspace(c))
287                        ungetc(c, fpi);
288                      endline = FALSE;
289                      cols = 0;
290                      if (prnlength - lines <= prnbmargin)
291                        endpage = TRUE;
292                    }
293                    if (endpage) {
294                      if (prnbmargin) {
295                        if (c != '\x0c') {
296                          if (!skipping)
297                            fputc('\r\x0c', fpo);
298                        }
299                      }
300                      lines = cols = 0;
301                      endpage = FALSE;
302                      startpage = TRUE;
303                      do {
304                        c = fgetc(fpi);
305                      } while (c == '\n');
306                      if (c == EOF)
307                        break;
308                      ungetc(c, fpi);
309                      if (prnformat && prnalt)
310                        skipping = (skipping) ? FALSE : TRUE;
311                      DosSleep(1);
312                    }
313                  }
314                  else
315                    fputc(c, fpo);
316                }
317                if (prnalt && prnformat && firstpass && pages > 1) {
318                  fclose(fpo);
319                  mode = "a+";
320                  fpo = xfsopen(li->targetpath, mode, SH_DENYRW, pszSrcFile, __LINE__, TRUE);
321                  if (fpo) {
322                    rewind(fpi);
323                    firstpass = FALSE;
324                    skipping = TRUE;
325                    rc = saymsg(MB_YESNOCANCEL | MB_ICONEXCLAMATION,
326                                HWND_DESKTOP,
327                                GetPString(IDS_PRINTTITLETEXT),
328                                GetPString(IDS_PRINTEVENTEXT), li->list[x]);
329                    if (rc == MBID_YES) {
330                      lmargin = prnrmargin;
331                      rmargin = prnlmargin;
332                      fputc('\x0c', fpo);
333                      goto Again;
334                    }
335                  }
336                  else
337                    saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
338                           HWND_DESKTOP,
339                           GetPString(IDS_PRINTTITLETEXT),
340                           GetPString(IDS_PRINTCANTREOPENTEXT),
341                           li->targetpath);
342                }
343                if (prnformfeedafter)
344                  fputc('\x0c', fpo);
345                if (!StopPrinting) {
346                  sprintf(s, GetPString(IDS_PRINTEDTEXT), li->list[x]);
347                  AddNote(s);
348                }
349                fclose(fpo);
350              }
351              fclose(fpi);
352            }
353          }
354          DosReleaseMutexSem(PrintSem);
355          DosSleep(1);
356        }
357        if (!StopPrinting)
358          AddNote(GetPString(IDS_PRINTEDLISTTEXT));
359      }
360      WinDestroyMsgQueue(hmq2);
361    }
362    DecrThreadUsage();
363    WinTerminate(hab2);
364  }
365Abort:
366  if (li)
367    FreeListInfo(li);
368#   ifdef FORTIFY
369    Fortify_LeaveScope();
370#    endif
371}
372
373MRESULT EXPENTRY PrintDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
374{
375  LISTINFO *li;
376
377  switch (msg) {
378  case WM_INITDLG:
379    if (!mp2)
380      WinDismissDlg(hwnd, 0);
381    else {
382      WinSetWindowPtr(hwnd, QWL_USER, mp2);
383      WinSendDlgItemMsg(hwnd, PRN_WIDTH, EM_SETTEXTLIMIT,
384                        MPFROM2SHORT(3, 0), MPVOID);
385      WinSendDlgItemMsg(hwnd, PRN_LENGTH, EM_SETTEXTLIMIT,
386                        MPFROM2SHORT(3, 0), MPVOID);
387      WinSendDlgItemMsg(hwnd, PRN_LMARGIN, EM_SETTEXTLIMIT,
388                        MPFROM2SHORT(2, 0), MPVOID);
389      WinSendDlgItemMsg(hwnd, PRN_RMARGIN, EM_SETTEXTLIMIT,
390                        MPFROM2SHORT(2, 0), MPVOID);
391      WinSendDlgItemMsg(hwnd, PRN_TMARGIN, EM_SETTEXTLIMIT,
392                        MPFROM2SHORT(2, 0), MPVOID);
393      WinSendDlgItemMsg(hwnd, PRN_BMARGIN, EM_SETTEXTLIMIT,
394                        MPFROM2SHORT(2, 0), MPVOID);
395      WinSendDlgItemMsg(hwnd, PRN_SPACING, EM_SETTEXTLIMIT,
396                        MPFROM2SHORT(1, 0), MPVOID);
397      WinSendDlgItemMsg(hwnd, PRN_TABSPACES, EM_SETTEXTLIMIT,
398                        MPFROM2SHORT(2, 0), MPVOID);
399      WinSendDlgItemMsg(hwnd, PRN_PRINTER, EM_SETTEXTLIMIT,
400                        MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
401      WinSendMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
402      PosOverOkay(hwnd);
403    }
404    break;
405
406  case UM_UNDO:
407    WinCheckButton(hwnd, PRN_FORMAT, prnformat);
408    WinCheckButton(hwnd, PRN_ALT, prnalt);
409    WinCheckButton(hwnd, PRN_PAGENUMS, prnpagenums);
410    WinCheckButton(hwnd, PRN_FORMBEFORE, prnformfeedbefore);
411    WinCheckButton(hwnd, PRN_FORMAFTER, prnformfeedafter);
412    {
413      CHAR s[33];
414
415      sprintf(s, "%lu", prnwidth);
416      WinSetDlgItemText(hwnd, PRN_WIDTH, s);
417      sprintf(s, "%lu", prnlength);
418      WinSetDlgItemText(hwnd, PRN_LENGTH, s);
419      sprintf(s, "%lu", prnlmargin);
420      WinSetDlgItemText(hwnd, PRN_LMARGIN, s);
421      sprintf(s, "%lu", prnrmargin);
422      WinSetDlgItemText(hwnd, PRN_RMARGIN, s);
423      sprintf(s, "%lu", prntmargin);
424      WinSetDlgItemText(hwnd, PRN_TMARGIN, s);
425      sprintf(s, "%lu", prnbmargin);
426      WinSetDlgItemText(hwnd, PRN_BMARGIN, s);
427      sprintf(s, "%lu", prnspacing);
428      WinSetDlgItemText(hwnd, PRN_SPACING, s);
429      sprintf(s, "%lu", prntabspaces);
430      WinSetDlgItemText(hwnd, PRN_TABSPACES, s);
431    }
432    WinSetDlgItemText(hwnd, PRN_PRINTER, printer);
433    WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
434    li = WinQueryWindowPtr(hwnd, QWL_USER);
435    if (!li)
436      Runtime_Error(pszSrcFile, __LINE__, NULL);
437    else {
438      INT x;
439
440      for (x = 0; li->list[x]; x++) {
441        if (IsFile(li->list[x]) == 1) {
442          WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_INSERTITEM,
443                            MPFROM2SHORT(LIT_END, 0), MPFROMP(li->list[x]));
444          WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_SELECTITEM,
445                            MPFROM2SHORT(x, 0), MPFROMSHORT(TRUE));
446        }
447      }
448      if (!(SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYITEMCOUNT,
449                                     MPVOID, MPVOID)) {
450        saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
451               hwnd,
452               GetPString(IDS_TWIDDLETEXT), GetPString(IDS_NOPRINTABLETEXT));
453        WinDismissDlg(hwnd, 0);
454      }
455    }
456    return 0;
457
458  case WM_CONTROL:
459    switch (SHORT1FROMMP(mp1)) {
460    case PRN_LISTBOX:
461      if (SHORT2FROMMP(mp1) == LN_ENTER) {
462
463        SHORT x;
464        CHAR szBuffer[CCHMAXPATH];
465
466        x = (SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYSELECTION,
467                                      MPFROMSHORT(LIT_FIRST), MPVOID);
468        if (x >= 0) {
469          *szBuffer = 0;
470          WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYITEMTEXT,
471                            MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer));
472          if (*szBuffer)
473            QuickView(hwnd, szBuffer);
474        }
475      }
476    }
477    return 0;
478
479  case WM_COMMAND:
480    switch (SHORT1FROMMP(mp1)) {
481    case DID_OK:
482      li = WinQueryWindowPtr(hwnd, QWL_USER);
483      if (!li)
484        Runtime_Error(pszSrcFile, __LINE__, NULL);
485      else {
486        prnformat = WinQueryButtonCheckstate(hwnd, PRN_FORMAT);
487        PrfWriteProfileData(fmprof, FM3Str, "Prnformat",
488                            (PVOID) & prnformat, sizeof(prnformat));
489        prnalt = WinQueryButtonCheckstate(hwnd, PRN_ALT);
490        PrfWriteProfileData(fmprof, FM3Str, "Prnalt",
491                            (PVOID) & prnalt, sizeof(prnalt));
492        prnpagenums = WinQueryButtonCheckstate(hwnd, PRN_PAGENUMS);
493        PrfWriteProfileData(fmprof, FM3Str, "Prnpagenums",
494                            (PVOID) & prnpagenums, sizeof(prnpagenums));
495        prnformfeedbefore = WinQueryButtonCheckstate(hwnd, PRN_FORMBEFORE);
496        PrfWriteProfileData(fmprof, FM3Str, "Prnformfeedbefore",
497                            (PVOID) & prnformfeedbefore,
498                            sizeof(prnformfeedbefore));
499        prnformfeedafter = WinQueryButtonCheckstate(hwnd, PRN_FORMAFTER);
500        PrfWriteProfileData(fmprof, FM3Str, "Prnformfeedafter",
501                            (PVOID) & prnformfeedafter,
502                            sizeof(prnformfeedafter));
503        {
504          CHAR s[33];
505
506          *s = 0;
507          WinQueryDlgItemText(hwnd, PRN_WIDTH, sizeof(s), s);
508          if (atol(s) < 24 || atol(s) > 4096) {
509            WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_WIDTH));
510            if (!fAlertBeepOff)
511              DosBeep(50, 100);
512            break;
513          }
514          prnwidth = atol(s);
515          PrfWriteProfileData(fmprof, FM3Str, "Prnwidth",
516                              (PVOID) & prnwidth, sizeof(prnwidth));
517          *s = 0;
518          WinQueryDlgItemText(hwnd, PRN_LENGTH, sizeof(s), s);
519          if (atol(s) < 24 || atol(s) > 4096) {
520            WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_LENGTH));
521            if (!fAlertBeepOff)
522              DosBeep(50, 100);
523            break;
524          }
525          prnlength = atol(s);
526          PrfWriteProfileData(fmprof, FM3Str, "Prnlength",
527                              (PVOID) & prnlength, sizeof(prnlength));
528          *s = 0;
529          WinQueryDlgItemText(hwnd, PRN_LMARGIN, sizeof(s), s);
530          if (atol(s) < 0 || atol(s) > prnwidth - 1) {
531            WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_LMARGIN));
532            if (!fAlertBeepOff)
533              DosBeep(50, 100);
534            break;
535          }
536          prnlmargin = atol(s);
537          PrfWriteProfileData(fmprof, FM3Str, "Prnlmargin",
538                              (PVOID) & prnlmargin, sizeof(prnlmargin));
539          *s = 0;
540          WinQueryDlgItemText(hwnd, PRN_RMARGIN, sizeof(s), s);
541          if (atol(s) < 0 || atol(s) > (prnwidth - prnlmargin) - 1) {
542            WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_RMARGIN));
543            if (!fAlertBeepOff)
544              DosBeep(50, 100);
545            break;
546          }
547          prnrmargin = atol(s);
548          PrfWriteProfileData(fmprof, FM3Str, "Prnrmargin",
549                              (PVOID) & prnrmargin, sizeof(prnrmargin));
550          *s = 0;
551          WinQueryDlgItemText(hwnd, PRN_TABSPACES, sizeof(s), s);
552          if (atol(s) < 1 ||
553              atol(s) > prnwidth - ((prnlmargin + prnrmargin) - 1)) {
554            WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_TABSPACES));
555            if (!fAlertBeepOff)
556              DosBeep(50, 100);
557            break;
558          }
559          prntabspaces = atol(s);
560          PrfWriteProfileData(fmprof, FM3Str, "Prntabspaces",
561                              (PVOID) & prntabspaces, sizeof(prntabspaces));
562          *s = 0;
563          WinQueryDlgItemText(hwnd, PRN_TMARGIN, sizeof(s), s);
564          if (atol(s) < 0 || atol(s) > prnlength - 1) {
565            WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_TMARGIN));
566            if (!fAlertBeepOff)
567              DosBeep(50, 100);
568            break;
569          }
570          prntmargin = atol(s);
571          PrfWriteProfileData(fmprof, FM3Str, "Prntmargin",
572                              (PVOID) & prntmargin, sizeof(prntmargin));
573          *s = 0;
574          WinQueryDlgItemText(hwnd, PRN_BMARGIN, sizeof(s), s);
575          if (atol(s) < 0 || atol(s) > (prnlength - prntmargin) - 1) {
576            WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_BMARGIN));
577            if (!fAlertBeepOff)
578              DosBeep(50, 100);
579            break;
580          }
581          prnbmargin = atol(s);
582          PrfWriteProfileData(fmprof, FM3Str, "Prnbmargin",
583                              (PVOID) & prnbmargin, sizeof(prnbmargin));
584          *s = 0;
585          WinQueryDlgItemText(hwnd, PRN_SPACING, sizeof(s), s);
586          if (atol(s) < 1 ||
587              atol(s) > ((prnlength - prntmargin) - prnbmargin) - 1) {
588            WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_SPACING));
589            if (!fAlertBeepOff)
590              DosBeep(50, 100);
591            break;
592          }
593          prnspacing = atol(s);
594          PrfWriteProfileData(fmprof, FM3Str, "Prnspacing",
595                              (PVOID) & prnspacing, sizeof(prnspacing));
596          WinQueryDlgItemText(hwnd, PRN_PRINTER, sizeof(printer), printer);
597          bstrip(printer);
598          if (!*printer)
599            strcpy(printer, "PRN");
600          WinSetDlgItemText(hwnd, PRN_PRINTER, printer);
601          PrfWriteProfileString(fmprof, appname, "Printer", printer);
602          SayPrinterReady(hwnd);
603        }
604        {
605          CHAR szBuffer[CCHMAXPATH + 1];
606          UINT numfiles = 0, numalloc = 0;
607          INT error;
608          SHORT x;
609
610          if (li->list)
611            FreeList(li->list);
612          li->list = NULL;
613          x = (SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYSELECTION,
614                                        MPFROMSHORT(LIT_FIRST), MPVOID);
615          if (x >= 0) {
616            do {
617              *szBuffer = 0;
618              WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYITEMTEXT,
619                                MPFROM2SHORT(x, CCHMAXPATH),
620                                MPFROMP(szBuffer));
621              error = AddToList(szBuffer, &li->list, &numfiles, &numalloc);
622              if (error) {
623                Runtime_Error(pszSrcFile, __LINE__, "AddToList");
624                break;
625              }
626              x = (SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX,
627                                            LM_QUERYSELECTION,
628                                            MPFROMSHORT(x), MPVOID);
629            } while (x >= 0);
630          }
631        }
632        if (!li->list || !li->list[0])
633          WinDismissDlg(hwnd, 0);
634        else
635          WinDismissDlg(hwnd, 1);
636      }
637      break;
638    case DID_CANCEL:
639      WinDismissDlg(hwnd, 0);
640      break;
641    case IDM_HELP:
642      if (hwndHelp)
643        WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
644                   MPFROM2SHORT(HELP_PRINT, 0), MPFROMSHORT(HM_RESOURCEID));
645      break;
646    case IDM_UNDO:
647      PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
648      break;
649    }
650    return 0;
651  }
652  return WinDefDlgProc(hwnd, msg, mp1, mp2);
653}
654
655#pragma alloc_text(PRINTER,PrinterReady,SayPrinterReady)
656#pragma alloc_text(PRINTER2,PrintListThread)
657#pragma alloc_text(PRINTER3,PrintDlgProc)
Note: See TracBrowser for help on using the repository browser.