source: trunk/gui/shared/PrintUtl.VRS@ 82

Last change on this file since 82 was 82, checked in by Alex Taylor, 7 years ago

CUPSWIZ and PRINTMAN add support for EPSONINK driver.
CUPSWIZ: fixed logic to find model in driver.

File size: 24.6 KB
Line 
1/*:VRX GetDriverSource
2*/
3/* Figure out where to look for the PrinterPak driver files used as the install
4 * source. Preference is given to the local repository (PDR_DIR); if it's not
5 * there, we look in a couple of other places where it might have ended up.
6 * Note that we don't look for the actual installed driver files under \OS2\DLL;
7 * if the application wants to fall back to those in some way, then it will have
8 * to take care of that logic itself.
9 *
10 * Various global values are assumed to be set already:
11 * - globals.!prdrv: filespec of \OS2\INSTALL\PRDRV.LST
12 * - globals.!repository: value indicated by PM_INSTALL->PDR_DIR in OS2.INI
13 *
14 * Returns the path, or '' if not found. Also, 'pmdx' will be 0-9 if the
15 * driver is in the repository (indicating the repository subdirectory), or
16 * '' if the driver is not in the repository.
17 */
18GetDriverSource: PROCEDURE EXPOSE globals. pmdx
19 ARG driver
20 IF driver == '' THEN RETURN ''
21
22 drv_file = ''
23 IF globals.!repository <> '' THEN DO
24
25 /* See if the driver is defined in the local repository. (This is the
26 * directory where installable printer drivers are kept. OS/2 gets them
27 * from here when you select 'Printer driver included with OS/2'.)
28 */
29 pmdx = GetDriverPMDD( driver, globals.!prdrv )
30 IF pmdx == '' THEN DO
31 /* Hmm, the driver isn't listed in PRDRV.LST. Let's check to see if
32 * it's in the default repository location anyway.
33 */
34 IF WORDPOS( driver, 'ECUPS ECUPS-HP PSPRINT PSPRINT2') > 0 THEN
35 pmdx = '9'
36 ELSE
37 pmdx = '0'
38 drv_file = STREAM( globals.!repository'\PMDD_'pmdx'\'driver'.DRV', 'C', 'QUERY EXISTS')
39 IF drv_file <> '' THEN DO
40 /* We found the driver in the repository, even though it isn't
41 * defined as such. So let's add the proper definition to
42 * PRDRV.LST now.
43 */
44 CALL LINEOUT globals.!prdrv, LEFT( driver'.DRV', 14 ) pmdx ||,
45 ' (added automatically)'
46 CALL LINEOUT globals.!prdrv
47 END
48 ELSE
49 pmdx = ''
50 END
51 ELSE DO
52 /* The driver is listed; now make sure it's actually there.
53 */
54 drv_file = STREAM( globals.!repository'\PMDD_'pmdx'\'driver'.DRV', 'C', 'QUERY EXISTS')
55 END
56 END
57
58 IF drv_file == '' THEN DO
59 CALL LINEOUT globals.!log1, 'Driver' driver 'is not in the local repository.'
60 /* If the driver really isn't in the repository, there are a couple of
61 * other places that various install utilities might have put it...
62 */
63 PARSE VALUE VRGetIni('PM_INSTALL', driver'_DIR', 'USER') WITH drvr_dir '00'x .
64 IF drvr_dir == '' THEN
65 PARSE VALUE VRGetIni('InstPDR', 'PATH_TO_'driver, 'USER') WITH drvr_dir '00'x .
66 IF drvr_dir <> '' THEN DO
67 drv_file = drvr_dir'\'driver'.DRV'
68 CALL LINEOUT globals.!log1, 'Found driver in' drvr_dir'.'
69 END
70 END
71
72RETURN drv_file
73
74
75/*:VRX GetDriverPMDD
76*/
77/* Check to see which repository directory the specified driver resides in.
78 * Returns the number suffix of the PMDD_* subdirectory name, or '' if either
79 * the driver or the index file could not be located.
80 */
81GetDriverPMDD: PROCEDURE
82 PARSE ARG driver, prdrv_lst
83
84 IF prdrv_lst <> '' THEN DO
85 CALL LINEIN prdrv_lst, 1, 0
86 DO WHILE LINES( prdrv_lst ) > 0
87 PARSE VALUE LINEIN( prdrv_lst ) WITH (driver)'.DRV' pmdx .
88 IF pmdx <> '' THEN LEAVE
89 END
90 CALL STREAM prdrv_lst, 'C', 'CLOSE'
91 END
92 ELSE pmdx = ''
93
94RETURN pmdx
95
96
97/*:VRX VerifyDriverEAs
98*/
99/* Make sure the driver has its extended attributes. If not, look for an
100 * accompanying .EA or .EA_ file, and join it to the driver.
101 */
102VerifyDriverEAs: PROCEDURE EXPOSE globals.
103 PARSE ARG driver
104 eas.0 = 0
105 CALL SysQueryEAList driver, 'eas.'
106 IF eas.0 == 0 THEN DO
107 ea_file = SUBSTR( driver, 1, LASTPOS('.', driver )) || 'EA'
108 IF STREAM( ea_file, 'C', 'QUERY EXISTS') == '' THEN
109 ea_file = ea_file || '_'
110 IF STREAM( ea_file, 'C', 'QUERY EXISTS') == '' THEN
111 RETURN 0
112
113 ADDRESS CMD '@UNLOCK' driver '2>NUL 1>NUL'
114 ADDRESS CMD '@EAUTIL' driver ea_file '/j /p 2>NUL 1>NUL'
115 END
116RETURN 1
117
118
119/*:VRX CopyDriverToSource
120*/
121/* Copies a printerpak driver and all its files from one directory to another.
122 * Usually the target is the source (repository) directory used for
123 * installation, hence the function name. However, this routine can be used
124 * in other contexts as well.
125 *
126 * driver - The fully-qualified filename of the printerpak driver
127 * newdrvdir - The directory where the files will be copied; must exist
128 *
129 * Returns: 1 on success, 0 on failure
130 */
131CopyDriverToSource: PROCEDURE EXPOSE globals.
132 PARSE ARG driver, newdrvdir
133
134 drv_dir = VRParseFilePath( driver, 'DP')
135 IF drv_dir == '' THEN RETURN 0
136
137 IF VerifyDriverEAs( driver ) == 0 THEN RETURN 0
138
139 CALL LINEOUT globals.!log1, 'Copying driver files from' drv_dir 'to' newdrvdir'...'
140
141 /* Read the list of required driver files from the EAs, and copy them
142 * all to the target directory.
143 */
144 IF SysGetEA( driver, 'REQUIREDDRIVERFILES', 'reqfiles') == 0 THEN DO
145 PARSE VAR reqfiles 5 filelist
146 filelist = TRANSLATE( filelist, ' ', ',')
147 DO i = 1 TO WORDS( filelist )
148 copyfile = drv_dir'\' || WORD( filelist, i )
149 ok = VRCopyFile( copyfile, newdrvdir'\' || WORD( filelist, i ))
150 CALL LINEOUT globals.!log1, ' -' copyfile '(REQUIRED):' ok
151 END
152 DROP copyfile
153 DROP filelist
154 END
155 ELSE RETURN 0
156
157 /* If there are optional files defined as well, try to copy those also.
158 */
159 IF SysGetEA( driver, 'OPTIONALDRIVERFILES', 'reqfiles') == 0 THEN DO
160 PARSE VAR reqfiles 5 filelist
161 filelist = TRANSLATE( filelist, ' ', ',')
162 DO i = 1 TO WORDS( filelist )
163 copyfile = drv_dir'\' || WORD( filelist, i )
164 IF STREAM( copyfile, 'C', 'QUERY EXISTS') == '' THEN ITERATE
165 ok = VRCopyFile( copyfile, newdrvdir'\' || WORD( filelist, i ))
166 CALL LINEOUT globals.!log1, ' -' copyfile '(OPTIONAL):' ok
167 END
168 DROP copyfile
169 DROP filelist
170 END
171
172RETURN 1
173
174
175/*:VRX PrinterExistsInDRV
176*/
177/* Determine if the specified PrinterPak driver already contains support
178 * for the specified printer model.
179 *
180 * If so, return the name of the model as found in the driver (necessary in
181 * order to make sure the correct case is retained, which may be different
182 * from what was requested). Otherwise return ''.
183 */
184PrinterExistsInDRV: PROCEDURE EXPOSE globals.
185 PARSE UPPER ARG printer_drv, printer_name
186 printer_name = TRANSLATE( printer_name, '_', '.')
187
188 IF STREAM( printer_drv, 'C', 'QUERY EXISTS') == '' THEN
189 printer_drv = GetDriverSource( VRParseFilePath( printer_drv, 'N'))
190 IF STREAM( printer_drv, 'C', 'QUERY EXISTS') == '' THEN
191 RETURN ''
192
193 IF SysGetEA( printer_drv, '.EXPAND', 'exist_ea') <> 0 THEN RETURN ''
194 PARSE VAR exist_ea 1 _eatype 3 .
195 IF C2X( _eatype ) <> 'FDFF' THEN RETURN ''
196
197 PARSE VAR exist_ea 3 _ealen 5 exist_models
198 total_len = C2D( REVERSE( _ealen ))
199
200 /* The variable exist_models now contains a null-separated list of printer
201 * models supported by the driver (including those from previously-imported
202 * PPD files). Next we check each one against our requested printer name.
203 */
204 start = 1
205 found = ''
206 CALL LINEOUT globals.!log1, 'Looking for "'printer_name'" in' printer_drv'...'
207 DO WHILE ( found == '') & ( start < total_len )
208 _strend = POS('0'x, exist_models, start )
209 IF _strend == 0 THEN LEAVE
210 _model = SUBSTR( exist_models, start, _strend - start )
211 IF TRANSLATE( _model ) == printer_name THEN
212 found = _model
213 ELSE
214 start = _strend + 1
215 END
216
217RETURN found
218
219
220/*:VRX CreateDriverList
221*/
222/* Generate a driver listfile from the .EXPAND EA
223 */
224CreateDriverList: PROCEDURE EXPOSE globals.
225 ARG driver, listfile
226
227 IF STREAM( listfile, 'C', 'QUERY EXISTS') <> '' THEN
228 CALL SysFileDelete listfile
229
230 drv_name = FILESPEC('NAME', driver )
231 IF SysGetEA( driver, '.EXPAND', 'eaval') == 0 THEN DO
232 PARSE VAR eaval 3 ealen 5 models
233 offs = 1
234 datalen = C2D( REVERSE( ealen ))
235 DO WHILE offs <= datalen
236 start = SUBSTR( models, offs )
237 inc = POS('00'x, start )
238 IF inc > 1 THEN DO
239 current_name = STRIP( SUBSTR( start, 1, inc-1 ))
240 CALL LINEOUT listfile, current_name':' current_name '('drv_name')'
241 END
242 offs = offs + inc
243 END
244 CALL LINEOUT listfile
245 CALL LINEOUT globals.!log1, 'Created driver list' listfile 'for' driver'.'
246 END
247 ELSE
248 CALL LINEOUT globals.!log1, 'No drivers found in' driver '(missing .EXPAND extended attribute?)'
249
250RETURN 1
251
252
253/*:VRX AddPort_CUPS
254*/
255/* Adds a new CUPS port. Returns 0 on full success, 1 if the port was created
256 * but could not be configured, and an OS/2 or PM error code otherwise.
257 */
258AddPort_CUPS: PROCEDURE EXPOSE globals.
259 PARSE ARG portname, hostname, queuename
260 CALL LINEOUT globals.!log1, 'Creating new port' portname
261 ADDRESS CMD '@cupsport' portname hostname queuename '>>' globals.!log2
262 IF rc == 1 THEN DO
263 CALL VRSetIni 'PM_'portname, 'INITIALIZATION', hostname'#'queuename||'00'x, 'SYSTEM', 'NoClose'
264 CALL VRSetIni 'PM_'portname, 'DESCRIPTION', hostname':'queuename||'00'x, 'SYSTEM'
265 END
266RETURN rc
267
268
269/*:VRX DeletePort
270*/
271/* Deletes a printer port (any type).
272 */
273DeletePort: PROCEDURE EXPOSE globals.
274 PARSE ARG portname
275 CALL SysIni 'SYSTEM', 'PM_'portname, 'DELETE:'
276 CALL SysIni 'SYSTEM', 'PM_SPOOLER_PORT', portname, 'DELETE:'
277RETURN 1
278
279
280/*:VRX GetNextPortName
281*/
282/* Get the next unique (non-existing) port name for the specified port driver.
283 */
284GetNextPortName: PROCEDURE
285 ARG portdrv
286
287 maxports = 64 /* should be smarter about this if possible */
288 exists = 1
289 x = 0
290 DO WHILE ( x < maxports ) & ( exists == 1 )
291 x = x + 1
292 portname = portdrv || x
293 nextport = SysIni('SYSTEM', 'PM_SPOOLER_PORT', portname )
294 IF LEFT( nextport, 6 ) == 'ERROR:' THEN exists = 0
295 END
296 IF exists == 1 THEN
297 portname = ''
298
299RETURN portname
300
301
302/*:VRX GetQueueName
303*/
304/* Generate a unique queue name from the specified printer name.
305 */
306GetQueueName: PROCEDURE
307 ARG queuename
308
309 DO UNTIL badchar = 0
310 badchar = VERIFY( queuename, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ-_0123456789 ')
311 IF badchar > 0 THEN
312 queuename = OVERLAY(' ', queuename, badchar, 1 )
313 END
314 queuename = LEFT( SPACE( queuename, 0 ), 8 )
315
316 tail = 0
317 PARSE VALUE VRGetIni('PM_SPOOLER', 'DIR', 'SYSTEM') WITH spldir ';' .
318 DO WHILE VRFileExists( spldir'\'queuename ) == 1
319 tail = tail + 1
320 queuename = STRIP( LEFT( queuename, 8 - LENGTH( tail ))) || tail
321 END
322
323RETURN queuename
324
325
326/*:VRX InstallPrintDriver
327*/
328/* 'Installs' (that is to say, registers with the spooler) an OS printer
329 * device driver/model. Installs the corresponding printerpak driver if
330 * necessary.
331 *
332 * driver - The name of the printerpak driver (without path or extension)
333 * driverfull - The fully-qualified filename of the printerpak driver
334 * model - The printer make/model name used by the driver
335 *
336 * Returns: 0 on success, 1 on error
337 */
338InstallPrintDriver: PROCEDURE EXPOSE globals.
339 PARSE ARG driver, driverfull, model
340
341 ok = 0
342 targetdir = globals.!os2dir'\DLL\'driver
343 targetdrv = targetdir'\'driver'.DRV'
344 IF ( VRFileExists( targetdrv ) == 0 ) THEN DO
345 CALL VRMkDir targetdir
346 r = CopyDriverToSource( driverfull, targetdir )
347 IF r <> 1 THEN ok = 1
348 END
349 IF ok == 0 THEN DO
350 IF VRGetIni('PM_DEVICE_DRIVERS', driver, 'USER') <> targetdrv THEN
351 CALL VRSetIni 'PM_DEVICE_DRIVERS', driver, targetdrv||'00'x, 'USER'
352 CALL VRSetIni 'PM_SPOOLER_DD', driver'.'model, driver'.DRV;;;'||'00'x, 'SYSTEM'
353 END
354RETURN ok
355
356
357/*:VRX CreatePrinterObject
358*/
359/* Create the specified printer using SysCreateObject (this should create the
360 * queue automatically).
361 *
362 * Returns: 0 on success or non-zero return code on error.
363 */
364CreatePrinterObject: PROCEDURE EXPOSE globals.
365 PARSE ARG driver, model, portname, queuename, printername
366
367 CALL LINEOUT globals.!log1, 'Creating new printer:' printername '('queuename')'
368 ADDRESS CMD '@prntobj' queuename portname '"'driver'.'model'" "'printername'" >>' globals.!log2
369/*
370 oid = '<WPPO_'queuename'>'
371 setup = 'PORTNAME='portname';PRINTDRIVER='driver'.'model';QUEUENAME='queuename';TAKEDEFAULTS=YES'
372 CALL LINEOUT globals.!log1, 'Creating printer object "'printername'" with setup string "'setup';OBJECTID='oid';"'
373 ok = SysCreateObject('WPPrinter', printername, '<WP_DESKTOP>', setup';OBJECTID='oid';', 'F')
374 IF ok == 1 THEN
375 CALL SysMoveObject oid, '<WP_PRINTERSFOLDER>'
376 ELSE DO
377 CALL LINEOUT globals.!log1, ' - creation failed, trying again without object-ID ...'
378 ok = SysCreateObject('WPPrinter', printername, '<WP_DESKTOP>', setup';', 'F')
379 END
380 IF ok == 1 THEN ok = 0
381 ELSE DO
382 CALL LINEOUT globals.!log1, ' - unable to create object!'
383 ok = 1
384 END
385 CALL LINEOUT globals.!log1
386*/
387
388RETURN rc
389
390
391/*:VRX RSPCreatePort
392*/
393/* Create/update a RINSTPRN response file to create the specified port.
394 */
395RSPCreatePort: PROCEDURE
396 PARSE ARG rsp, portdriver, portname, hostname, printername
397
398 CALL LINEOUT rsp, '* Creates a new printer port.'
399 CALL LINEOUT rsp, '*'
400 CALL LINEOUT rsp, 'ADDPORT'
401 CALL LINEOUT rsp, ' NAME =' portname
402 CALL LINEOUT rsp, ' PORTDRIVER =' portdriver
403 CALL LINEOUT rsp, ' DESCRIPTION =' hostname':'printername
404 CALL LINEOUT rsp, ' INITIALIZATION =' hostname'#'printername
405 CALL LINEOUT rsp, ' TERMINATION = ;'
406 CALL LINEOUT rsp, ' TIMEOUT = 45;'
407 CALL LINEOUT rsp, 'ENDPORT'
408 CALL LINEOUT rsp, ''
409 CALL LINEOUT rsp
410RETURN 1
411
412
413/*:VRX RSPCreatePrinter
414*/
415/* Create a RINSTPRN response file to create the specified printer.
416 */
417RSPCreatePrinter: PROCEDURE
418 PARSE ARG rsp, driver, model, portname, queuename, printername
419
420 IF STREAM( rsp, 'C', 'QUERY EXISTS') <> '' THEN
421 CALL SysFileDelete rsp
422
423 /* This is temporary until we can implement proper options configuration */
424 PARSE UPPER VALUE VALUE('LANG',,'OS2ENVIRONMENT') WITH 1 . 4 _ctry 6 .
425 IF ( WORDPOS( _ctry, 'US CA MX BO CO VE PH CL') > 0 ) THEN
426 page = 'Letter'
427 ELSE
428 page = 'A4'
429 o9n = 'PORTRAIT'
430
431 CALL LINEOUT rsp, '* Creates both a printer queue and a desktop object for this printer.'
432 CALL LINEOUT rsp, '*'
433 CALL LINEOUT rsp, 'ADDQUEUE'
434 CALL LINEOUT rsp, ' NAME =' queuename
435 CALL LINEOUT rsp, ' COMMENT =' printername
436 CALL LINEOUT rsp, ' DRIVERNAME =' driver'.'model
437 CALL LINEOUT rsp, ' PORT =' portname
438 CALL LINEOUT rsp, ' DEFINEQUEUEPROPS'
439 CALL LINEOUT rsp, ' FORMNAME =' page
440 CALL LINEOUT rsp, ' ORIENTATION =' o9n
441 CALL LINEOUT rsp, ' ENDQUEUEPROPS'
442 CALL LINEOUT rsp, 'ENDQUEUE'
443 CALL LINEOUT rsp, ''
444 CALL LINEOUT rsp
445RETURN 1
446
447
448/*:VRX RSPInstallDriver
449*/
450/* Create/update a RINSTPRN response file to install the specified printer
451 * driver. (This doesn't always seem to work so we don't use it except as
452 * a fallback.)
453 */
454RSPInstallDriver: PROCEDURE
455 PARSE ARG rsp, driver, model
456
457 CALL LINEOUT rsp, '* Installs the' driver 'PrinterPak driver.'
458 CALL LINEOUT rsp, '*'
459 CALL LINEOUT rsp, 'ADDPRINTDRIVER'
460 CALL LINEOUT rsp, ' NAME =' driver
461 CALL LINEOUT rsp, 'ENDPRINTDRIVER'
462 CALL LINEOUT rsp, ''
463 CALL LINEOUT rsp, '* Installs support for the' model 'device.'
464 CALL LINEOUT rsp, '*'
465 CALL LINEOUT rsp, 'ADDPRINTDEVICE'
466 CALL LINEOUT rsp, ' NAME =' model
467 CALL LINEOUT rsp, ' DRIVER =' driver
468 CALL LINEOUT rsp, 'ENDPRINTDEVICE'
469 CALL LINEOUT rsp, ''
470 CALL LINEOUT rsp
471RETURN 1
472
473
474/*:VRX GetNameFromPPD
475*/
476GetNameFromPPD: PROCEDURE
477 ARG ppd_file
478
479 IF STREAM( ppd_file, 'C', 'QUERY EXISTS') == '' THEN RETURN ''
480 nickname = ''
481 IF VRParseFilePath( ppd_file, 'E') == 'GZ' THEN DO
482 nq = RXQUEUE('CREATE')
483 oq = RXQUEUE('SET', nq )
484 ADDRESS CMD '@gzip -c -d' ppd_file '| RXQUEUE' nq
485 DO QUEUED()
486 PARSE PULL line
487 line = STRIP( line )
488 IF LEFT( line, 15 ) == '*ShortNickName:' THEN DO
489 PARSE VAR line . ':' _nick '0D'x .
490 nickname = STRIP( _nick )
491 nickname = STRIP( nickname, 'B', '09'x )
492 nickname = STRIP( nickname, 'B', '"')
493 LEAVE
494 END
495 END
496 CALL RXQUEUE 'SET', oq
497 CALL RXQUEUE 'DELETE', nq
498 END
499 ELSE DO
500 CALL LINEIN ppd_file, 1, 0
501 DO WHILE LINES( ppd_file ) <> 0
502 line = STRIP( LINEIN( ppd_file ))
503 IF LEFT( line, 15 ) == '*ShortNickName:' THEN DO
504 PARSE VAR line . ':' _nick '0D'x .
505 nickname = STRIP( _nick )
506 nickname = STRIP( nickname, 'B', '09'x )
507 nickname = STRIP( nickname, 'B', '"')
508 LEAVE
509 END
510 END
511 CALL STREAM ppd_file, 'C', 'CLOSE'
512 END
513 nickname = TRANSLATE( nickname, ' ', '"')
514 nickname = TRANSLATE( nickname, ' ', "'")
515
516RETURN nickname
517
518/*:VRX CleanPPD
519*/
520/* Clean out lines from Gutenprint and Foomatic PPD files that are known to
521 * cause problems when importing with PIN. (Partially based on work by Paul
522 * Smedley and Peter Brown).
523 */
524CleanPPD: PROCEDURE
525 PARSE ARG in_ppd, logfile
526 IF logfile <> '' THEN
527 logfile = STREAM( logfile, 'C', 'QUERY EXISTS')
528
529 out_ppd = VRParseFilePath( in_ppd, 'DPN') || '.TMP'
530 IF STREAM( out_ppd, 'C', 'QUERY EXISTS') \= '' THEN
531 CALL SysFileDelete out_ppd
532
533 IF logfile <> '' THEN
534 CALL CHAROUT logfile, 'Doing cleanup on' in_ppd '...'
535
536 skip_next = 0
537 DO WHILE LINES( in_ppd ) \= 0
538 line = LINEIN( in_ppd )
539 SELECT
540 WHEN skip_next == 1 THEN DO
541 line = STRIP( TRANSLATE( line ))
542 IF line == '*END' THEN skip_next = 0
543 END
544 WHEN LEFT( line, 11 ) == '*StpDefault' THEN NOP
545 WHEN LEFT( line, 7 ) == '*StpStp' THEN NOP
546 WHEN LEFT( line, 18 ) == '*StpResolutionMap:' THEN NOP
547 WHEN LEFT( line, 14 ) == '*OPOptionHints' THEN NOP
548 WHEN LEFT( line, 4 ) == '*da.' THEN NOP
549 WHEN LEFT( line, 4 ) == '*de.' THEN NOP
550 WHEN LEFT( line, 4 ) == '*es.' THEN NOP
551 WHEN LEFT( line, 4 ) == '*fi.' THEN NOP
552 WHEN LEFT( line, 4 ) == '*fr.' THEN NOP
553 WHEN LEFT( line, 4 ) == '*it.' THEN NOP
554 WHEN LEFT( line, 4 ) == '*ja.' THEN NOP
555 WHEN LEFT( line, 4 ) == '*ko.' THEN NOP
556 WHEN LEFT( line, 4 ) == '*nb.' THEN NOP
557 WHEN LEFT( line, 4 ) == '*nl.' THEN NOP
558 WHEN LEFT( line, 4 ) == '*pt.' THEN NOP
559 WHEN LEFT( line, 4 ) == '*sv.' THEN NOP
560 WHEN LEFT( line, 7 ) == '*zh_CN.' THEN NOP
561 WHEN LEFT( line, 7 ) == '*zh_TW.' THEN NOP
562 WHEN LEFT( line, 9 ) == '*Foomatic' THEN DO
563 line = STRIP( line )
564 IF RIGHT( line, 2 ) == '&&' THEN skip_next = 1
565 END
566 OTHERWISE DO
567 CALL LINEOUT out_ppd, line
568 skip_next = 0
569 END
570 END
571 END
572 CALL STREAM in_ppd, 'C', 'CLOSE'
573 CALL STREAM out_ppd, 'C', 'CLOSE'
574
575 ok = VRCopyFile( out_ppd, in_ppd )
576 IF logfile <> '' THEN DO
577 IF ok == 1 THEN
578 CALL LINEOUT logfile, 'OK'
579 ELSE DO
580 CALL LINEOUT logfile, 'Failed!'
581 CALL LINEOUT logfile, ' ->' VRError()
582 END
583 CALL LINEOUT logfile, ''
584 END
585 CALL SysFileDelete out_ppd
586
587RETURN
588
589/*:VRX MatchPrinterModel
590*/
591/* Find a set of printers supported by the OS/2 driver which mostly closely
592 * match the given name.
593 */
594MatchPrinterModel: PROCEDURE EXPOSE globals. models.
595 PARSE UPPER ARG driver_name, printer_name
596 printer_name = TRANSLATE( printer_name, '_', '.')
597 printer_drv = globals.!os2dir'\DLL\'driver_name'\'driver_name'.DRV'
598 models.0 = 0
599
600 IF SysGetEA( printer_drv, '.EXPAND', 'exist_ea') <> 0 THEN RETURN 0
601 PARSE VAR exist_ea 1 _eatype 3 .
602 IF C2X( _eatype ) <> 'FDFF' THEN RETURN 0
603
604 PARSE VAR exist_ea 3 _ealen 5 exist_models
605 total_len = C2D( REVERSE( _ealen ))
606
607 /* The variable exist_models now contains a null-separated list of printer
608 * models supported by the driver (including those from previously-imported
609 * PPD files). Next we check each one against our requested printer name.
610 */
611 start = 1
612 count = 0
613 best = 0
614 DO WHILE start < total_len
615 _strend = POS('0'x, exist_models, start )
616 IF _strend == 0 THEN LEAVE
617 _model = TRANSLATE( SUBSTR( exist_models, start, _strend - start ))
618 _model = TRANSLATE( _model, ' ', '-')
619 _comp = COMPARE( _model, printer_name )
620 IF WORD( _model, 1 ) == WORD( printer_name, 1 ) THEN DO
621 count = count + 1
622 IF _comp == 0 THEN DO
623 _comp = 9999
624 best = count
625 END
626 ELSE IF ( best == 0 ) & ( _comp > LENGTH( printer_name )) THEN
627 best = count
628/*
629 models.count = RIGHT( _comp, 4, '0') SUBSTR( exist_models, start, _strend - start )
630*/
631 models.count = SUBSTR( exist_models, start, _strend - start )
632 END
633 start = _strend + 1
634 END
635 models.0 = count
636
637/*
638 CALL SysStemSort 'models.', 'D', 'I',,, 1, 4
639 DO i = 1 TO count
640 models.i = SUBWORD( models.i, 2 )
641 END
642*/
643RETURN best
644
645/*:VRX QueryAvailableDrivers
646*/
647/* Determine which of our supported PrinterPak drivers are currently available.
648 */
649QueryAvailableDrivers: PROCEDURE EXPOSE globals. drv_list.
650 drv_list.0 = 0
651
652 test_drivers = 'ECUPS ECUPS-HP EPSONINK PSPRINT'
653 DO i = 1 TO WORDS( test_drivers )
654 driver = WORD( test_drivers, i )
655 ok = GetDriverSource( driver )
656 IF ok == '' THEN
657 ok = VRGetIni('PM_DEVICE_DRIVERS', driver, 'USER')
658 IF ok <> '' THEN
659 CALL SysStemInsert 'drv_list.', drv_list.0+1, driver
660 END
661
662RETURN drv_list.0
663
664/*:VRX NLSGetMessage
665*/
666/*
667 * Gets the message text associated with the given message number from the
668 * current language file.
669 */
670NLSGetMessage: PROCEDURE EXPOSE globals.
671 PARSE ARG msgnum, .
672 args = ARG()
673
674 msgfile = globals.!messages
675 IF msgnum == '' THEN RETURN ''
676
677 sub_parms = ''
678 DO i = 2 TO args
679 sub_parms = sub_parms', "'ARG( i )'"'
680 END
681
682 INTERPRET 'msgfromfile = SysGetMessage( msgnum, msgfile' sub_parms ')'
683
684 PARSE VAR msgfromfile message '0D'x .
685 IF SUBSTR( message, 1, 4 ) == 'SYS0' THEN message = ''
686
687RETURN message
688
689/*:VRX NLSSetText
690*/
691/*
692 * Sets the specified property of the specified control to the specified
693 * message text.
694 */
695NLSSetText: PROCEDURE EXPOSE globals.
696 PARSE ARG control, property, message, substitution
697 args = ARG()
698
699 success = 1
700 IF args < 4 THEN
701 text = NLSGetMessage( message )
702 ELSE DO
703 sub_parms = ''
704 DO i = 4 TO args
705 sub_parms = sub_parms '"'|| ARG( i ) ||'",'
706 END
707 sub_parms = STRIP( sub_parms, 'T', ',')
708 INTERPRET 'text = NLSGetMessage( message, 'sub_parms')'
709 END
710
711 IF text == '' THEN success = 0
712 ELSE CALL VRSet control, property, text
713
714RETURN success
715
Note: See TracBrowser for help on using the repository browser.