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

Last change on this file since 91 was 91, checked in by Alex Taylor, 5 years ago

Update CleanPPD function to scrub *ru. and *zh.

File size: 24.7 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 ) == '*ru.' THEN NOP
560 WHEN LEFT( line, 4 ) == '*sv.' THEN NOP
561 WHEN LEFT( line, 4 ) == '*zh.' THEN NOP
562 WHEN LEFT( line, 7 ) == '*zh_CN.' THEN NOP
563 WHEN LEFT( line, 7 ) == '*zh_TW.' THEN NOP
564 WHEN LEFT( line, 9 ) == '*Foomatic' THEN DO
565 line = STRIP( line )
566 IF RIGHT( line, 2 ) == '&&' THEN skip_next = 1
567 END
568 OTHERWISE DO
569 CALL LINEOUT out_ppd, line
570 skip_next = 0
571 END
572 END
573 END
574 CALL STREAM in_ppd, 'C', 'CLOSE'
575 CALL STREAM out_ppd, 'C', 'CLOSE'
576
577 ok = VRCopyFile( out_ppd, in_ppd )
578 IF logfile <> '' THEN DO
579 IF ok == 1 THEN
580 CALL LINEOUT logfile, 'OK'
581 ELSE DO
582 CALL LINEOUT logfile, 'Failed!'
583 CALL LINEOUT logfile, ' ->' VRError()
584 END
585 CALL LINEOUT logfile, ''
586 END
587 CALL SysFileDelete out_ppd
588
589RETURN
590
591/*:VRX MatchPrinterModel
592*/
593/* Find a set of printers supported by the OS/2 driver which mostly closely
594 * match the given name.
595 */
596MatchPrinterModel: PROCEDURE EXPOSE globals. models.
597 PARSE UPPER ARG driver_name, printer_name
598 printer_name = TRANSLATE( printer_name, '_', '.')
599 printer_drv = globals.!os2dir'\DLL\'driver_name'\'driver_name'.DRV'
600 models.0 = 0
601
602 IF SysGetEA( printer_drv, '.EXPAND', 'exist_ea') <> 0 THEN RETURN 0
603 PARSE VAR exist_ea 1 _eatype 3 .
604 IF C2X( _eatype ) <> 'FDFF' THEN RETURN 0
605
606 PARSE VAR exist_ea 3 _ealen 5 exist_models
607 total_len = C2D( REVERSE( _ealen ))
608
609 /* The variable exist_models now contains a null-separated list of printer
610 * models supported by the driver (including those from previously-imported
611 * PPD files). Next we check each one against our requested printer name.
612 */
613 start = 1
614 count = 0
615 best = 0
616 DO WHILE start < total_len
617 _strend = POS('0'x, exist_models, start )
618 IF _strend == 0 THEN LEAVE
619 _model = TRANSLATE( SUBSTR( exist_models, start, _strend - start ))
620 _model = TRANSLATE( _model, ' ', '-')
621 _comp = COMPARE( _model, printer_name )
622 IF WORD( _model, 1 ) == WORD( printer_name, 1 ) THEN DO
623 count = count + 1
624 IF _comp == 0 THEN DO
625 _comp = 9999
626 best = count
627 END
628 ELSE IF ( best == 0 ) & ( _comp > LENGTH( printer_name )) THEN
629 best = count
630/*
631 models.count = RIGHT( _comp, 4, '0') SUBSTR( exist_models, start, _strend - start )
632*/
633 models.count = SUBSTR( exist_models, start, _strend - start )
634 END
635 start = _strend + 1
636 END
637 models.0 = count
638
639/*
640 CALL SysStemSort 'models.', 'D', 'I',,, 1, 4
641 DO i = 1 TO count
642 models.i = SUBWORD( models.i, 2 )
643 END
644*/
645RETURN best
646
647/*:VRX QueryAvailableDrivers
648*/
649/* Determine which of our supported PrinterPak drivers are currently available.
650 */
651QueryAvailableDrivers: PROCEDURE EXPOSE globals. drv_list.
652 drv_list.0 = 0
653
654 test_drivers = 'ECUPS ECUPS-HP EPSONINK PSPRINT'
655 DO i = 1 TO WORDS( test_drivers )
656 driver = WORD( test_drivers, i )
657 ok = GetDriverSource( driver )
658 IF ok == '' THEN
659 ok = VRGetIni('PM_DEVICE_DRIVERS', driver, 'USER')
660 IF ok <> '' THEN
661 CALL SysStemInsert 'drv_list.', drv_list.0+1, driver
662 END
663
664RETURN drv_list.0
665
666/*:VRX NLSGetMessage
667*/
668/*
669 * Gets the message text associated with the given message number from the
670 * current language file.
671 */
672NLSGetMessage: PROCEDURE EXPOSE globals.
673 PARSE ARG msgnum, .
674 args = ARG()
675
676 msgfile = globals.!messages
677 IF msgnum == '' THEN RETURN ''
678
679 sub_parms = ''
680 DO i = 2 TO args
681 sub_parms = sub_parms', "'ARG( i )'"'
682 END
683
684 INTERPRET 'msgfromfile = SysGetMessage( msgnum, msgfile' sub_parms ')'
685
686 PARSE VAR msgfromfile message '0D'x .
687 IF SUBSTR( message, 1, 4 ) == 'SYS0' THEN message = ''
688
689RETURN message
690
691/*:VRX NLSSetText
692*/
693/*
694 * Sets the specified property of the specified control to the specified
695 * message text.
696 */
697NLSSetText: PROCEDURE EXPOSE globals.
698 PARSE ARG control, property, message, substitution
699 args = ARG()
700
701 success = 1
702 IF args < 4 THEN
703 text = NLSGetMessage( message )
704 ELSE DO
705 sub_parms = ''
706 DO i = 4 TO args
707 sub_parms = sub_parms '"'|| ARG( i ) ||'",'
708 END
709 sub_parms = STRIP( sub_parms, 'T', ',')
710 INTERPRET 'text = NLSGetMessage( message, 'sub_parms')'
711 END
712
713 IF text == '' THEN success = 0
714 ELSE CALL VRSet control, property, text
715
716RETURN success
717
Note: See TracBrowser for help on using the repository browser.