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

Last change on this file since 27 was 27, checked in by Alex Taylor, 12 years ago

Various minor fixes.

File size: 23.8 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 */
180PrinterExistsInDRV: PROCEDURE EXPOSE globals.
181 PARSE UPPER ARG driver_name, printer_name
182 printer_name = TRANSLATE( printer_name, '_', '.')
183
184 printer_drv = globals.!bootdrv'\OS2\DLL\'driver_name'\'driver_name'.DRV'
185 /* ?? TODO: install driver_name if not found (prompt first) ?? */
186
187 IF SysGetEA( printer_drv, '.EXPAND', 'exist_ea') <> 0 THEN RETURN 0
188 PARSE VAR exist_ea 1 _eatype 3 .
189 IF C2X( _eatype ) <> 'FDFF' THEN RETURN 0
190
191 PARSE VAR exist_ea 3 _ealen 5 exist_models
192 total_len = C2D( REVERSE( _ealen ))
193
194 /* The variable exist_models now contains a null-separated list of printer
195 * models supported by the driver (including those from previously-imported
196 * PPD files). Next we check each one against our requested printer name.
197 */
198 start = 1
199 found = 0
200 DO WHILE ( found == 0 ) & ( start < total_len )
201 _strend = POS('0'x, exist_models, start )
202 IF _strend == 0 THEN LEAVE
203 _model = TRANSLATE( SUBSTR( exist_models, start, _strend - start ))
204 IF _model == printer_name THEN
205 found = 1
206 ELSE
207 start = _strend + 1
208 END
209
210RETURN found
211
212
213/*:VRX CreateDriverList
214*/
215/* Generate a driver listfile from the .EXPAND EA
216 */
217CreateDriverList: PROCEDURE EXPOSE globals.
218 ARG driver, listfile
219
220 IF STREAM( listfile, 'C', 'QUERY EXISTS') <> '' THEN
221 CALL SysFileDelete listfile
222
223 drv_name = FILESPEC('NAME', driver )
224 IF SysGetEA( driver, '.EXPAND', 'eaval') == 0 THEN DO
225 PARSE VAR eaval 3 ealen 5 models
226 offs = 1
227 datalen = C2D( REVERSE( ealen ))
228 DO WHILE offs <= datalen
229 start = SUBSTR( models, offs )
230 inc = POS('00'x, start )
231 IF inc > 1 THEN DO
232 current_name = STRIP( SUBSTR( start, 1, inc-1 ))
233 CALL LINEOUT listfile, current_name':' current_name '('drv_name')'
234 END
235 offs = offs + inc
236 END
237 CALL LINEOUT listfile
238 CALL LINEOUT globals.!log1, 'Created driver list' listfile 'for' driver'.'
239 END
240 ELSE
241 CALL LINEOUT globals.!log1, 'No drivers found in' driver '(missing .EXPAND extended attribute?)'
242
243RETURN 1
244
245
246/*:VRX AddPort_CUPS
247*/
248/* Adds a new CUPS port. Returns 0 on full success, 1 if the port was created
249 * but could not be configured, and an OS/2 or PM error code otherwise.
250 */
251AddPort_CUPS: PROCEDURE EXPOSE globals.
252 PARSE ARG portname, hostname, queuename
253 CALL LINEOUT globals.!log1, 'Creating new port' portname
254 ADDRESS CMD '@cupsport' portname hostname queuename '>>' globals.!log2
255 IF rc == 1 THEN DO
256 CALL VRSetIni 'PM_'portname, 'INITIALIZATION', hostname'#'queuename||'00'x, 'SYSTEM', 'NoClose'
257 CALL VRSetIni 'PM_'portname, 'DESCRIPTION', hostname':'queuename||'00'x, 'SYSTEM'
258 END
259RETURN rc
260
261
262/*:VRX DeletePort
263*/
264/* Deletes a printer port (any type).
265 */
266DeletePort: PROCEDURE EXPOSE globals.
267 PARSE ARG portname
268 CALL SysIni 'SYSTEM', 'PM_'portname, 'DELETE:'
269 CALL SysIni 'SYSTEM', 'PM_SPOOLER_PORT', portname, 'DELETE:'
270RETURN 1
271
272
273/*:VRX GetNextPortName
274*/
275/* Get the next unique (non-existing) port name for the specified port driver.
276 */
277GetNextPortName: PROCEDURE
278 ARG portdrv
279
280 maxports = 64 /* should be smarter about this if possible */
281 exists = 1
282 x = 0
283 DO WHILE ( x < maxports ) & ( exists == 1 )
284 x = x + 1
285 portname = portdrv || x
286 nextport = SysIni('SYSTEM', 'PM_SPOOLER_PORT', portname )
287 IF LEFT( nextport, 6 ) == 'ERROR:' THEN exists = 0
288 END
289 IF exists == 1 THEN
290 portname = ''
291
292RETURN portname
293
294
295/*:VRX GetQueueName
296*/
297/* Generate a unique queue name from the specified printer name.
298 */
299GetQueueName: PROCEDURE
300 ARG queuename
301
302 DO UNTIL badchar = 0
303 badchar = VERIFY( queuename, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ-_0123456789 ')
304 IF badchar > 0 THEN
305 queuename = OVERLAY(' ', queuename, badchar, 1 )
306 END
307 queuename = LEFT( SPACE( queuename, 0 ), 8 )
308
309 tail = 0
310 PARSE VALUE VRGetIni('PM_SPOOLER', 'DIR', 'SYSTEM') WITH spldir ';' .
311 DO WHILE VRFileExists( spldir'\'queuename ) == 1
312 tail = tail + 1
313 queuename = STRIP( LEFT( queuename, 8 - LENGTH( tail ))) || tail
314 END
315
316RETURN queuename
317
318
319/*:VRX InstallPrintDriver
320*/
321/* 'Installs' (that is to say, registers with the spooler) an OS printer
322 * device driver/model. Installs the corresponding printerpak driver if
323 * necessary.
324 *
325 * driver - The name of the printerpak driver (without path or extension)
326 * driverfull - The fully-qualified filename of the printerpak driver
327 * model - The printer make/model name used by the driver
328 *
329 * Returns: 0 on success, 1 on error
330 */
331InstallPrintDriver: PROCEDURE EXPOSE globals.
332 PARSE ARG driver, driverfull, model
333
334 ok = 0
335 targetdir = globals.!os2dir'\DLL\'driver
336 targetdrv = targetdir'\'driver'.DRV'
337 IF ( VRFileExists( targetdrv ) == 0 ) THEN DO
338 CALL VRMkDir targetdir
339 r = CopyDriverToSource( driverfull, targetdir )
340 IF r <> 1 THEN ok = 1
341 END
342 IF ok == 0 THEN DO
343 IF VRGetIni('PM_DEVICE_DRIVERS', driver, 'USER') <> targetdrv THEN
344 CALL VRSetIni 'PM_DEVICE_DRIVERS', driver, targetdrv||'00'x, 'USER'
345 CALL VRSetIni 'PM_SPOOLER_DD', driver'.'model, driver'.DRV;;;'||'00'x, 'SYSTEM'
346 END
347RETURN ok
348
349
350/*:VRX CreatePrinterObject
351*/
352/* Create the specified printer using SysCreateObject (this should create the
353 * queue automatically).
354 *
355 * Returns: 0 on success or non-zero return code on error.
356 */
357CreatePrinterObject: PROCEDURE EXPOSE globals.
358 PARSE ARG driver, model, portname, queuename, printername
359
360 CALL LINEOUT globals.!log1, 'Creating new printer:' printername '('queuename')'
361 ADDRESS CMD '@prntobj' queuename portname '"'driver'.'model'" "'printername'" >>' globals.!log2
362/*
363 oid = '<WPPO_'queuename'>'
364 setup = 'PORTNAME='portname';PRINTDRIVER='driver'.'model';QUEUENAME='queuename';TAKEDEFAULTS=YES'
365 CALL LINEOUT globals.!log1, 'Creating printer object "'printername'" with setup string "'setup';OBJECTID='oid';"'
366 ok = SysCreateObject('WPPrinter', printername, '<WP_DESKTOP>', setup';OBJECTID='oid';', 'F')
367 IF ok == 1 THEN
368 CALL SysMoveObject oid, '<WP_PRINTERSFOLDER>'
369 ELSE DO
370 CALL LINEOUT globals.!log1, ' - creation failed, trying again without object-ID ...'
371 ok = SysCreateObject('WPPrinter', printername, '<WP_DESKTOP>', setup';', 'F')
372 END
373 IF ok == 1 THEN ok = 0
374 ELSE DO
375 CALL LINEOUT globals.!log1, ' - unable to create object!'
376 ok = 1
377 END
378 CALL LINEOUT globals.!log1
379*/
380
381RETURN rc
382
383
384/*:VRX RSPCreatePort
385*/
386/* Create/update a RINSTPRN response file to create the specified port.
387 */
388RSPCreatePort: PROCEDURE
389 PARSE ARG rsp, portdriver, portname, hostname, printername
390
391 CALL LINEOUT rsp, '* Creates a new printer port.'
392 CALL LINEOUT rsp, '*'
393 CALL LINEOUT rsp, 'ADDPORT'
394 CALL LINEOUT rsp, ' NAME =' portname
395 CALL LINEOUT rsp, ' PORTDRIVER =' portdriver
396 CALL LINEOUT rsp, ' DESCRIPTION =' hostname':'printername
397 CALL LINEOUT rsp, ' INITIALIZATION =' hostname'#'printername
398 CALL LINEOUT rsp, ' TERMINATION = ;'
399 CALL LINEOUT rsp, ' TIMEOUT = 45;'
400 CALL LINEOUT rsp, 'ENDPORT'
401 CALL LINEOUT rsp, ''
402 CALL LINEOUT rsp
403RETURN 1
404
405
406/*:VRX RSPCreatePrinter
407*/
408/* Create a RINSTPRN response file to create the specified printer.
409 */
410RSPCreatePrinter: PROCEDURE
411 PARSE ARG rsp, driver, model, portname, queuename, printername
412
413 IF STREAM( rsp, 'C', 'QUERY EXISTS') <> '' THEN
414 CALL SysFileDelete rsp
415
416 /* This is temporary until we can implement proper options configuration */
417 PARSE UPPER VALUE VALUE('LANG',,'OS2ENVIRONMENT') WITH 1 . 4 _ctry 6 .
418 IF ( WORDPOS( _ctry, 'US CA MX BO CO VE PH CL') > 0 ) THEN
419 page = 'Letter'
420 ELSE
421 page = 'A4'
422 o9n = 'PORTRAIT'
423
424 CALL LINEOUT rsp, '* Creates both a printer queue and a desktop object for this printer.'
425 CALL LINEOUT rsp, '*'
426 CALL LINEOUT rsp, 'ADDQUEUE'
427 CALL LINEOUT rsp, ' NAME =' queuename
428 CALL LINEOUT rsp, ' COMMENT =' printername
429 CALL LINEOUT rsp, ' DRIVERNAME =' driver'.'model
430 CALL LINEOUT rsp, ' PORT =' portname
431 CALL LINEOUT rsp, ' DEFINEQUEUEPROPS'
432 CALL LINEOUT rsp, ' FORMNAME =' page
433 CALL LINEOUT rsp, ' ORIENTATION =' o9n
434 CALL LINEOUT rsp, ' ENDQUEUEPROPS'
435 CALL LINEOUT rsp, 'ENDQUEUE'
436 CALL LINEOUT rsp, ''
437 CALL LINEOUT rsp
438RETURN 1
439
440
441/*:VRX RSPInstallDriver
442*/
443/* Create/update a RINSTPRN response file to install the specified printer
444 * driver. (This doesn't always seem to work so we don't use it except as
445 * a fallback.)
446 */
447RSPInstallDriver: PROCEDURE
448 PARSE ARG rsp, driver, model
449
450 CALL LINEOUT rsp, '* Installs the' driver 'PrinterPak driver.'
451 CALL LINEOUT rsp, '*'
452 CALL LINEOUT rsp, 'ADDPRINTDRIVER'
453 CALL LINEOUT rsp, ' NAME =' driver
454 CALL LINEOUT rsp, 'ENDPRINTDRIVER'
455 CALL LINEOUT rsp, ''
456 CALL LINEOUT rsp, '* Installs support for the' model 'device.'
457 CALL LINEOUT rsp, '*'
458 CALL LINEOUT rsp, 'ADDPRINTDEVICE'
459 CALL LINEOUT rsp, ' NAME =' model
460 CALL LINEOUT rsp, ' DRIVER =' driver
461 CALL LINEOUT rsp, 'ENDPRINTDEVICE'
462 CALL LINEOUT rsp, ''
463 CALL LINEOUT rsp
464RETURN 1
465
466
467/*:VRX GetNameFromPPD
468*/
469GetNameFromPPD: PROCEDURE
470 ARG ppd_file
471
472 IF STREAM( ppd_file, 'C', 'QUERY EXISTS') == '' THEN RETURN ''
473 nickname = ''
474 IF VRParseFilePath( ppd_file, 'E') == 'GZ' THEN DO
475 nq = RXQUEUE('CREATE')
476 oq = RXQUEUE('SET', nq )
477 ADDRESS CMD '@gzip -c -d' ppd_file '| RXQUEUE' nq
478 DO QUEUED()
479 PARSE PULL line
480 line = STRIP( line )
481 IF LEFT( line, 15 ) == '*ShortNickName:' THEN DO
482 PARSE VAR line . ':' _nick '0D'x .
483 nickname = STRIP( _nick )
484 nickname = STRIP( nickname, 'B', '"')
485 LEAVE
486 END
487 END
488 CALL RXQUEUE 'SET', oq
489 CALL RXQUEUE 'DELETE', nq
490 END
491 ELSE DO
492 CALL LINEIN ppd_file, 1, 0
493 DO WHILE LINES( ppd_file ) <> 0
494 line = STRIP( LINEIN( ppd_file ))
495 IF LEFT( line, 15 ) == '*ShortNickName:' THEN DO
496 PARSE VAR line . ':' _nick '0D'x .
497 nickname = STRIP( _nick )
498 nickname = STRIP( nickname, 'B', '"')
499 LEAVE
500 END
501 END
502 CALL STREAM ppd_file, 'C', 'CLOSE'
503 END
504
505RETURN nickname
506
507/*:VRX CleanPPD
508*/
509/* Clean out lines from Gutenprint and Foomatic PPD files that are known to
510 * cause problems when importing with PIN. (Partially based on work by Paul
511 * Smedley and Peter Brown).
512 */
513CleanPPD: PROCEDURE
514 PARSE ARG in_ppd, logfile
515 IF logfile <> '' THEN
516 logfile = STREAM( logfile, 'C', 'QUERY EXISTS')
517
518 out_ppd = VRParseFilePath( in_ppd, 'DPN') || '.TMP'
519 IF STREAM( out_ppd, 'C', 'QUERY EXISTS') \= '' THEN
520 CALL SysFileDelete out_ppd
521
522 IF logfile <> '' THEN
523 CALL CHAROUT logfile, 'Doing cleanup on' in_ppd '...'
524
525 skip_next = 0
526 DO WHILE LINES( in_ppd ) \= 0
527 line = LINEIN( in_ppd )
528 SELECT
529 WHEN skip_next == 1 THEN DO
530 line = STRIP( TRANSLATE( line ))
531 IF line == '*END' THEN skip_next = 0
532 END
533 WHEN LEFT( line, 11 ) == '*StpDefault' THEN NOP
534 WHEN LEFT( line, 7 ) == '*StpStp' THEN NOP
535 WHEN LEFT( line, 18 ) == '*StpResolutionMap:' THEN NOP
536 WHEN LEFT( line, 14 ) == '*OPOptionHints' THEN NOP
537 WHEN LEFT( line, 4 ) == '*de.' THEN NOP
538 WHEN LEFT( line, 4 ) == '*es.' THEN NOP
539 WHEN LEFT( line, 4 ) == '*fr.' THEN NOP
540 WHEN LEFT( line, 4 ) == '*it.' THEN NOP
541 WHEN LEFT( line, 4 ) == '*ja.' THEN NOP
542 WHEN LEFT( line, 4 ) == '*ko.' THEN NOP
543 WHEN LEFT( line, 4 ) == '*nl.' THEN NOP
544 WHEN LEFT( line, 4 ) == '*pt.' THEN NOP
545 WHEN LEFT( line, 4 ) == '*sv.' THEN NOP
546 WHEN LEFT( line, 7 ) == '*zh_CN.' THEN NOP
547 WHEN LEFT( line, 7 ) == '*zh_TW.' THEN NOP
548 WHEN LEFT( line, 9 ) == '*Foomatic' THEN DO
549 line = STRIP( line )
550 IF RIGHT( line, 2 ) == '&&' THEN skip_next = 1
551 END
552 OTHERWISE DO
553 CALL LINEOUT out_ppd, line
554 skip_next = 0
555 END
556 END
557 END
558 CALL STREAM in_ppd, 'C', 'CLOSE'
559 CALL STREAM out_ppd, 'C', 'CLOSE'
560
561 ok = VRCopyFile( out_ppd, in_ppd )
562 IF logfile <> '' THEN DO
563 IF ok == 1 THEN
564 CALL LINEOUT logfile, 'OK'
565 ELSE DO
566 CALL LINEOUT logfile, 'Failed!'
567 CALL LINEOUT logfile, ' ->' VRError()
568 END
569 CALL LINEOUT logfile, ''
570 END
571 CALL SysFileDelete out_ppd
572
573RETURN
574
575/*:VRX MatchPrinterModel
576*/
577/* Find a set of printers supported by the OS/2 driver which mostly closely
578 * match the given name.
579 */
580MatchPrinterModel: PROCEDURE EXPOSE globals. models.
581 PARSE UPPER ARG driver_name, printer_name
582 printer_name = TRANSLATE( printer_name, '_', '.')
583 printer_drv = globals.!bootdrv'\OS2\DLL\'driver_name'\'driver_name'.DRV'
584 models.0 = 0
585
586 IF SysGetEA( printer_drv, '.EXPAND', 'exist_ea') <> 0 THEN RETURN 0
587 PARSE VAR exist_ea 1 _eatype 3 .
588 IF C2X( _eatype ) <> 'FDFF' THEN RETURN 0
589
590 PARSE VAR exist_ea 3 _ealen 5 exist_models
591 total_len = C2D( REVERSE( _ealen ))
592
593 /* The variable exist_models now contains a null-separated list of printer
594 * models supported by the driver (including those from previously-imported
595 * PPD files). Next we check each one against our requested printer name.
596 */
597 start = 1
598 count = 0
599 best = 0
600 DO WHILE start < total_len
601 _strend = POS('0'x, exist_models, start )
602 IF _strend == 0 THEN LEAVE
603 _model = TRANSLATE( SUBSTR( exist_models, start, _strend - start ))
604 _model = TRANSLATE( _model, ' ', '-')
605 _comp = COMPARE( _model, printer_name )
606 IF WORD( _model, 1 ) == WORD( printer_name, 1 ) THEN DO
607 count = count + 1
608 IF _comp == 0 THEN DO
609 _comp = 9999
610 best = count
611 END
612 ELSE IF ( best == 0 ) & ( _comp > LENGTH( printer_name )) THEN
613 best = count
614/*
615 models.count = RIGHT( _comp, 4, '0') SUBSTR( exist_models, start, _strend - start )
616*/
617 models.count = SUBSTR( exist_models, start, _strend - start )
618 END
619 start = _strend + 1
620 END
621 models.0 = count
622
623/*
624 CALL SysStemSort 'models.', 'D', 'I',,, 1, 4
625 DO i = 1 TO count
626 models.i = SUBWORD( models.i, 2 )
627 END
628*/
629RETURN best
630
631/*:VRX QueryAvailableDrivers
632*/
633/* Determine which of our supported PrinterPak drivers are currently available.
634 */
635QueryAvailableDrivers: PROCEDURE EXPOSE globals. drv_list.
636 drv_list.0 = 0
637
638 test_drivers = 'ECUPS ECUPS-HP PSPRINT'
639 DO i = 1 TO WORDS( test_drivers )
640 driver = WORD( test_drivers, i )
641 ok = GetDriverSource( driver )
642 IF ok == '' THEN
643 ok = VRGetIni('PM_DEVICE_DRIVERS', driver, 'USER')
644 IF ok <> '' THEN
645 CALL SysStemInsert 'drv_list.', drv_list.0+1, driver
646 END
647
648RETURN drv_list.0
649
650/*:VRX NLSGetMessage
651*/
652/*
653 * Gets the message text associated with the given message number from the
654 * current language file.
655 */
656NLSGetMessage: PROCEDURE EXPOSE globals.
657 PARSE ARG msgnum, .
658 args = ARG()
659
660 msgfile = globals.!messages
661 IF msgnum == '' THEN RETURN ''
662
663 sub_parms = ''
664 DO i = 2 TO args
665 sub_parms = sub_parms', "'ARG( i )'"'
666 END
667
668 INTERPRET 'msgfromfile = SysGetMessage( msgnum, msgfile' sub_parms ')'
669
670 PARSE VAR msgfromfile message '0D'x .
671 IF SUBSTR( message, 1, 4 ) == 'SYS0' THEN message = ''
672
673RETURN message
674
675/*:VRX NLSSetText
676*/
677/*
678 * Sets the specified property of the specified control to the specified
679 * message text.
680 */
681NLSSetText: PROCEDURE EXPOSE globals.
682 PARSE ARG control, property, message, substitution
683 args = ARG()
684
685 success = 1
686 IF args < 4 THEN
687 text = NLSGetMessage( message )
688 ELSE DO
689 sub_parms = ''
690 DO i = 4 TO args
691 sub_parms = sub_parms '"'|| ARG( i ) ||'",'
692 END
693 sub_parms = STRIP( sub_parms, 'T', ',')
694 INTERPRET 'text = NLSGetMessage( message, 'sub_parms')'
695 END
696
697 IF text == '' THEN success = 0
698 ELSE CALL VRSet control, property, text
699
700RETURN success
701
Note: See TracBrowser for help on using the repository browser.