source: trunk/gui/shared/PrManUtl.VRS@ 43

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

Refresh printer container when default flag is changed. Minor tweak to directory setup logic when adding a new PM driver.

File size: 28.9 KB
Line 
1/*:VRX DriverIsInstalled
2*/
3/* Checks if a given print driver (without extension) is installed, and if so
4 * returns the path to the active files. Returns '' if the driver is not
5 * installed.
6 */
7DriverIsInstalled: PROCEDURE
8 ARG driver
9 PARSE VALUE VRGetIni('PM_DEVICE_DRIVERS', driver, 'USER') WITH drv_path '00'x .
10 IF ( drv_path <> '') THEN
11 drv_path = STREAM( drv_path, 'C', 'QUERY EXISTS')
12RETURN drv_path
13
14
15/*:VRX GetDriverSource
16*/
17/* Figure out where to look for the PrinterPak driver files used as the install
18 * source. Preference is given to the local repository (PDR_DIR); if it's not
19 * there, we look in a couple of other places where it might have ended up.
20 * Note that we don't look for the actual installed driver files under \OS2\DLL;
21 * that logic is handled in LocateDriverFiles(), which calls this routine.
22 *
23 * Various global values are assumed to be set already:
24 * - globals.!prdrv: filespec of \OS2\INSTALL\PRDRV.LST
25 * - globals.!repository: value indicated by PM_INSTALL->PDR_DIR in OS2.INI
26 *
27 * Arguments: The print driver name without path or extension
28 *
29 * Returns the path, or '' if not found. Also, 'pmdx' will be 0-9 if the
30 * driver is in the repository (indicating the repository subdirectory), or
31 * '' if the driver is not in the repository.
32 */
33GetDriverSource: PROCEDURE EXPOSE globals. pmdx
34 ARG driver
35 IF driver == '' THEN RETURN ''
36
37 drv_file = ''
38 IF globals.!repository <> '' THEN DO
39
40 /* See if the driver is defined in the local repository. (This is the
41 * directory where installable printer drivers are kept. OS/2 gets them
42 * from here when you select 'Printer driver included with OS/2'.)
43 */
44 pmdx = GetDriverPMDD( driver, globals.!prdrv )
45 IF pmdx == '' THEN DO
46 /* Hmm, the driver isn't listed in PRDRV.LST. Let's check to see if
47 * it's in the default repository location anyway.
48 */
49 IF WORDPOS( driver, 'ECUPS ECUPS-HP PSPRINT PSPRINT2') > 0 THEN
50 pmdx = '9'
51 ELSE
52 pmdx = '0'
53 drv_file = STREAM( globals.!repository'\PMDD_'pmdx'\'driver'.DRV', 'C', 'QUERY EXISTS')
54 IF drv_file <> '' THEN DO
55 /* We found the driver in the repository, even though it isn't
56 * defined as such. So let's add the proper definition to
57 * PRDRV.LST now.
58 */
59 CALL LINEOUT globals.!prdrv, LEFT( driver'.DRV', 14 ) pmdx ||,
60 ' (added automatically)'
61 CALL LINEOUT globals.!prdrv
62 END
63 ELSE
64 pmdx = ''
65 END
66 ELSE DO
67 /* The driver is listed; now make sure it's actually there.
68 */
69 drv_file = STREAM( globals.!repository'\PMDD_'pmdx'\'driver'.DRV', 'C', 'QUERY EXISTS')
70 END
71 END
72
73 IF drv_file == '' THEN DO
74 CALL LINEOUT globals.!log1, 'Driver' driver 'is not in the local repository.'
75 /* If the driver really isn't in the repository, there are a couple of
76 * other places that various install utilities might have put it...
77 */
78 PARSE VALUE VRGetIni('PM_INSTALL', driver'_DIR', 'USER') WITH drvr_dir '00'x .
79 IF drvr_dir == '' THEN
80 PARSE VALUE VRGetIni('InstPDR', 'PATH_TO_'driver, 'USER') WITH drvr_dir '00'x .
81 IF drvr_dir <> '' THEN DO
82 drv_file = drvr_dir'\'driver'.DRV'
83 CALL LINEOUT globals.!log1, 'Found driver in' drvr_dir'.'
84 END
85 END
86
87RETURN drv_file
88
89
90/*:VRX GetDriverPMDD
91*/
92/* Check to see which repository directory the specified driver resides in.
93 * Returns the number suffix of the PMDD_* subdirectory name, or '' if either
94 * the driver or the index file could not be located.
95 *
96 * Arguments: The print driver name without path or extension
97 */
98GetDriverPMDD: PROCEDURE
99 PARSE ARG driver, prdrv_lst
100
101 IF prdrv_lst <> '' THEN DO
102 CALL LINEIN prdrv_lst, 1, 0
103 DO WHILE LINES( prdrv_lst ) > 0
104 PARSE VALUE LINEIN( prdrv_lst ) WITH (driver)'.DRV' pmdx .
105 IF pmdx <> '' THEN LEAVE
106 END
107 CALL STREAM prdrv_lst, 'C', 'CLOSE'
108 END
109 ELSE pmdx = ''
110
111RETURN pmdx
112
113
114/*:VRX LocateDriverFiles
115*/
116/* Locates the source files for a PostScript-based driver that will be required in
117 * order to import a PPD using PIN. Not to be used with non-PostScript drivers,
118 * since it will fail if PIN or PPDENC are not found.
119 *
120 * Arguments: The print driver name without path or extension
121 *
122 * Returns:
123 * 0 - Driver files not found.
124 * 1 - Driver files found, path saved in 'driver_path'; 'driver_repo' will be 1
125 * if the driver is 'shipped' (i.e. defined in PRDRV.LST) or 0 otherwise.
126 * 2 - Only found installed driver files in (\OS2\DLL\xxx, saved in 'driver_path');
127 * will need to copy them somewhere for future installs.
128 */
129LocateDriverFiles: PROCEDURE EXPOSE globals. driver_path driver_repo
130 ARG driver
131 IF driver == '' THEN driver = 'PSCRIPT'
132
133 CALL LINEOUT globals.!log1, 'Looking for' driver 'files'
134
135 mustcopy = 0
136 driver_path = GetDriverSource( driver )
137
138 IF driver_path == '' THEN DO
139 /* No source found. We'll have to try copying the actual installed
140 * driver files from under \OS2\DLL.
141 */
142 CALL LINEOUT globals.!log1, 'Driver source not found. Trying installed driver.'
143 PARSE VALUE VRGetIni('PM_DEVICE_DRIVERS', driver, 'USER') WITH drv_used '00'x .
144 IF ( drv_used <> '') & VRFileExists( drv_used ) THEN
145 driver_path = drv_used
146 END
147 IF driver_path <> '' THEN DO
148 srcdir = VRParseFilePath( driver_path, 'DP')
149 pin = STREAM( srcdir'\PIN.EXE', 'C', 'QUERY EXISTS')
150 ppdenc = STREAM( srcdir'\PPDENC.EXE', 'C', 'QUERY EXISTS')
151 /* TODO should we check for all the REQUIREDDRIVER FILES as well? */
152 END
153
154 IF pmdx == '' THEN
155 driver_repo = 0
156 ELSE
157 driver_repo = 1
158
159 /* Driver (or one of its required files) was not found.
160 */
161 IF ( driver_path == '') | ( pin == '') | ( ppdenc == '') | ,
162 ( VerifyDriverEAs( driver_path ) == 0 ) THEN
163 DO
164 CALL LINEOUT globals.!log1, ' - Missing required driver files.'
165 RETURN 0
166 END
167
168 IF mustcopy THEN RETURN 2
169RETURN 1
170
171
172/*:VRX VerifyDriverEAs
173*/
174/* Make sure the driver has its extended attributes. If not, look for an
175 * accompanying .EA or .EA_ file, and join it to the driver.
176 */
177VerifyDriverEAs: PROCEDURE EXPOSE globals.
178 PARSE ARG driver
179 eas.0 = 0
180 CALL SysQueryEAList driver, 'eas.'
181 IF eas.0 == 0 THEN DO
182 ea_file = SUBSTR( driver, 1, LASTPOS('.', driver )) || 'EA'
183 IF STREAM( ea_file, 'C', 'QUERY EXISTS') == '' THEN
184 ea_file = ea_file || '_'
185 IF STREAM( ea_file, 'C', 'QUERY EXISTS') == '' THEN
186 RETURN 0
187
188 ADDRESS CMD '@UNLOCK' driver '2>NUL 1>NUL'
189 ADDRESS CMD '@EAUTIL' driver ea_file '/j /p 2>NUL 1>NUL'
190 END
191RETURN 1
192
193
194/*:VRX BldLevelVersion
195*/
196/* Parse the revision (version) number from a BLDLEVEL string
197 */
198BldLevelVersion: PROCEDURE EXPOSE globals.
199 ARG module
200 revision = ''
201
202 _nq = RXQUEUE('CREATE')
203 _oq = RXQUEUE('SET', _nq )
204
205 ADDRESS CMD '@bldlevel' module '2>&1 | RXQUEUE' _nq
206 DO QUEUED()
207 PARSE PULL _blline
208 IF LEFT( _blline, 9 ) == 'Revision:' THEN DO
209 PARSE VAR _blline 'Revision:' revision .
210 LEAVE
211 END
212 END
213
214 CALL RXQUEUE 'SET', _oq
215 CALL RXQUEUE 'DELETE', _nq
216
217 IF revision == '' THEN revision = '-'
218
219RETURN revision
220
221
222/*:VRX CopyPrinterPak
223*/
224/* Copies a printerpak driver and all its dependent files from one directory
225 * to another.
226 *
227 * driver - The fully-qualified filename of the printerpak .DRV
228 * newdrvdir - The directory where the files will be copied; must exist
229 *
230 * Returns: 1 on success, 0 on failure
231 */
232CopyPrinterPak: PROCEDURE EXPOSE globals.
233 PARSE ARG driver, newdrvdir
234
235 drv_dir = VRParseFilePath( driver, 'DP')
236 drv_name = VRParseFilePath( driver, 'NE')
237 IF drv_dir == '' THEN RETURN 0
238
239
240 IF VerifyDriverEAs( driver ) == 0 THEN RETURN 0
241
242 CALL LINEOUT globals.!log1, 'Copying driver files from' drv_dir 'to' newdrvdir'...'
243
244 /* Read the list of required driver files from the EAs, and copy them
245 * all to the target directory.
246 */
247 IF SysGetEA( driver, 'REQUIREDDRIVERFILES', 'reqfiles') == 0 THEN DO
248 PARSE VAR reqfiles 5 filelist
249 filelist = TRANSLATE( filelist, ' ', ',')
250 DO i = 1 TO WORDS( filelist )
251 copyfile = drv_dir'\' || WORD( filelist, i )
252 ok = VRCopyFile( copyfile, newdrvdir'\' || WORD( filelist, i ))
253 CALL LINEOUT globals.!log1, ' -' copyfile '(REQUIRED):' ok
254 END
255 DROP copyfile
256 DROP filelist
257 END
258 ELSE RETURN 0
259
260 /* If there are optional files defined as well, try to copy those also.
261 */
262 IF SysGetEA( driver, 'OPTIONALDRIVERFILES', 'reqfiles') == 0 THEN DO
263 PARSE VAR reqfiles 5 filelist
264 filelist = TRANSLATE( filelist, ' ', ',')
265 DO i = 1 TO WORDS( filelist )
266 copyfile = drv_dir'\' || WORD( filelist, i )
267 IF STREAM( copyfile, 'C', 'QUERY EXISTS') == '' THEN ITERATE
268 ok = VRCopyFile( copyfile, newdrvdir'\' || WORD( filelist, i ))
269 CALL LINEOUT globals.!log1, ' -' copyfile '(OPTIONAL):' ok
270 END
271 DROP copyfile
272 DROP filelist
273 END
274
275 eafile = VRParseFilePath( driver, 'N') || '.EA'
276 IF \VRFileExists( newdrvdir'\'eafile ) THEN
277 ADDRESS CMD '@EAUTIL' newdrvdir'\'drv_name ea_file '/s /p 2>NUL 1>NUL'
278
279RETURN 1
280
281
282/*:VRX PrinterExistsInDRV
283*/
284/* Determine if the specified PrinterPak driver already contains support
285 * for the specified printer model.
286 */
287PrinterExistsInDRV: PROCEDURE EXPOSE globals.
288 PARSE UPPER ARG driver_name, printer_name
289 printer_name = TRANSLATE( printer_name, '_', '.')
290
291 printer_drv = globals.!os2dir'\DLL\'driver_name'\'driver_name'.DRV'
292 /* ?? TODO: install driver_name if not found (prompt first) ?? */
293
294 IF SysGetEA( printer_drv, '.EXPAND', 'exist_ea') <> 0 THEN RETURN 0
295 PARSE VAR exist_ea 1 _eatype 3 .
296 IF C2X( _eatype ) <> 'FDFF' THEN RETURN 0
297
298 PARSE VAR exist_ea 3 _ealen 5 exist_models
299 total_len = C2D( REVERSE( _ealen ))
300
301 /* The variable exist_models now contains a null-separated list of printer
302 * models supported by the driver (including those from previously-imported
303 * PPD files). Next we check each one against our requested printer name.
304 */
305 start = 1
306 found = 0
307 DO WHILE ( found == 0 ) & ( start < total_len )
308 _strend = POS('0'x, exist_models, start )
309 IF _strend == 0 THEN LEAVE
310 _model = TRANSLATE( SUBSTR( exist_models, start, _strend - start ))
311 IF _model == printer_name THEN
312 found = 1
313 ELSE
314 start = _strend + 1
315 END
316
317RETURN found
318
319
320/*:VRX CreateDriverList
321*/
322/* Generate a driver listfile from the .EXPAND EA
323 */
324CreateDriverList: PROCEDURE EXPOSE globals.
325 ARG driver, listfile
326
327 IF STREAM( listfile, 'C', 'QUERY EXISTS') <> '' THEN
328 CALL SysFileDelete listfile
329
330 drv_name = FILESPEC('NAME', driver )
331 IF SysGetEA( driver, '.EXPAND', 'eaval') == 0 THEN DO
332 PARSE VAR eaval 3 ealen 5 models
333 offs = 1
334 datalen = C2D( REVERSE( ealen ))
335 DO WHILE offs <= datalen
336 start = SUBSTR( models, offs )
337 inc = POS('00'x, start )
338 IF inc > 1 THEN DO
339 current_name = STRIP( SUBSTR( start, 1, inc-1 ))
340 CALL LINEOUT listfile, current_name':' current_name '('drv_name')'
341 END
342 offs = offs + inc
343 END
344 CALL LINEOUT listfile
345 CALL LINEOUT globals.!log1, 'Created driver list' listfile 'for' driver'.'
346 END
347 ELSE
348 CALL LINEOUT globals.!log1, 'No drivers found in' driver '(missing .EXPAND extended attribute?)'
349
350RETURN 1
351
352
353/*:VRX AddPort_CUPS
354*/
355/* Adds a new CUPS port. Returns 0 on full success, 1 if the port was created
356 * but could not be configured, and an OS/2 or PM error code otherwise.
357 */
358AddPort_CUPS: PROCEDURE EXPOSE globals.
359 PARSE ARG portname, hostname, queuename
360 CALL LINEOUT globals.!log1, 'Creating new port' portname
361 ADDRESS CMD '@cupsport' portname hostname queuename '>>' globals.!log2
362 IF rc == 1 THEN DO
363 CALL VRSetIni 'PM_'portname, 'INITIALIZATION', hostname'#'queuename||'00'x, 'SYSTEM', 'NoClose'
364 CALL VRSetIni 'PM_'portname, 'DESCRIPTION', hostname':'queuename||'00'x, 'SYSTEM'
365 END
366RETURN rc
367
368
369/*:VRX DeletePort
370*/
371/* Deletes a printer port (any type).
372 */
373DeletePort: PROCEDURE EXPOSE globals.
374 PARSE ARG portname
375 CALL SysIni 'SYSTEM', 'PM_'portname, 'DELETE:'
376 CALL SysIni 'SYSTEM', 'PM_SPOOLER_PORT', portname, 'DELETE:'
377RETURN 1
378
379
380/*:VRX GetNextPortName
381*/
382/* Get the next unique (non-existing) port name for the specified port driver.
383 */
384GetNextPortName: PROCEDURE
385 ARG portdrv
386
387 maxports = 64 /* should be smarter about this if possible */
388 exists = 1
389 x = 0
390 DO WHILE ( x < maxports ) & ( exists == 1 )
391 x = x + 1
392 portname = portdrv || x
393 nextport = SysIni('SYSTEM', 'PM_SPOOLER_PORT', portname )
394 IF LEFT( nextport, 6 ) == 'ERROR:' THEN exists = 0
395 END
396 IF exists == 1 THEN
397 portname = ''
398
399RETURN portname
400
401
402/*:VRX GetPortDrivers
403*/
404/* Get the list of currently-installed port drivers. NOTE: we exclude LPRPDRVR
405 * from this list, because it has to be managed via the TCP/IP configuration
406 * program.
407 */
408GetPortDrivers: PROCEDURE EXPOSE portdrivers.
409 ok = SysIni('SYSTEM', 'PM_PORT_DRIVER', 'ALL:', 'installed.')
410 IF LEFT( ok, 6 ) == 'ERROR:' THEN RETURN 0
411 count = 0
412 DO i = 1 TO installed.0
413 IF installed.i = 'LPRPDRVR' THEN ITERATE
414 fullpath = STRIP( SysIni('SYSTEM', 'PM_PORT_DRIVER', installed.i ), 'T', '00'x )
415 IF LEFT( fullpath, 6 ) == 'ERROR:' THEN fullpath = ''
416 fullpath = STREAM( fullpath , 'C', 'QUERY EXISTS')
417 count = count + 1
418 portdrivers.count = installed.i || ' ' || fullpath
419 END
420 portdrivers.0 = count
421RETURN portdrivers.0
422
423
424/*:VRX GetQueueName
425*/
426/* Generate a unique queue name from the specified printer name.
427 */
428GetQueueName: PROCEDURE
429 ARG queuename
430
431 DO UNTIL badchar = 0
432 badchar = VERIFY( queuename, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ-_0123456789 ')
433 IF badchar > 0 THEN
434 queuename = OVERLAY(' ', queuename, badchar, 1 )
435 END
436 queuename = LEFT( SPACE( queuename, 0 ), 8 )
437
438 tail = 0
439 PARSE VALUE VRGetIni('PM_SPOOLER', 'DIR', 'SYSTEM') WITH spldir ';' .
440 DO WHILE VRFileExists( spldir'\'queuename ) == 1
441 tail = tail + 1
442 queuename = STRIP( LEFT( queuename, 8 - LENGTH( tail ))) || tail
443 END
444
445RETURN queuename
446
447
448/*:VRX InstallPortDriver
449*/
450/* Installs a new port driver.
451 *
452 * Returns: 0 on success, 1 on error
453 */
454InstallPortDriver: PROCEDURE EXPOSE globals.
455 ARG new_pdr
456 filename = VRParseFileName( new_pdr, 'NE')
457 IF filename == '' THEN RETURN
458 installed_pdr = TRANSLATE( globals.!os2dir'\DLL\'filename )
459 IF installed_pdr <> new_pdr THEN DO
460 ok = VRCopyFile( new_pdr, installed_pdr )
461 IF ok == 0 THEN RETURN 1
462 /* Try to copy any optional files as well */
463 IF SysGetEA( new_pdr, 'OPTIONALDRIVERFILES', 'reqfiles') == 0 THEN DO
464 drv_dir = VRParseFilePath( new_pdr, 'DP')
465 PARSE VAR reqfiles 5 filelist
466 filelist = TRANSLATE( filelist, ' ', ',')
467 DO i = 1 TO WORDS( filelist )
468 copyfile = drv_dir'\' || WORD( filelist, i )
469 IF STREAM( copyfile, 'C', 'QUERY EXISTS') == '' THEN ITERATE
470 ok = VRCopyFile( copyfile, newdrvdir'\' || WORD( filelist, i ))
471 /*CALL LINEOUT globals.!log1, ' -' copyfile '(OPTIONAL):' ok*/
472 END
473 END
474 END
475
476 key = VRParseFileName( installed_pdr, 'N')
477 CALL VRSetIni 'PM_PORT_DRIVER', key, installed_pdr||'00'x, 'SYSTEM'
478RETURN 0
479
480
481/*:VRX InstallPrintDriver
482*/
483/* 'Installs' (that is to say, registers with the spooler) an OS printer
484 * device driver/model. Installs the corresponding printerpak driver if
485 * necessary.
486 *
487 * driver - The name of the printerpak driver (without path or extension)
488 * driverfull - The fully-qualified filename of the printerpak driver
489 * model - The printer make/model name used by the driver
490 *
491 * Returns: 0 on success, 1 on error
492 */
493InstallPrintDriver: PROCEDURE EXPOSE globals.
494 PARSE ARG driver, driverfull, model
495
496 ok = 0
497 targetdir = globals.!os2dir'\DLL\'driver
498 targetdrv = targetdir'\'driver'.DRV'
499 CALL LINEOUT globals.!log1, 'Installing' driver'.'model 'from' driverfull '(target' targetdrv')'
500
501 IF ( VRFileExists( targetdrv ) == 0 ) THEN DO
502 CALL VRMkDir targetdir
503 r = CopyPrinterPak( driverfull, targetdir )
504 IF r <> 1 THEN ok = 1
505 END
506 IF ok == 0 THEN DO
507 IF VRGetIni('PM_DEVICE_DRIVERS', driver, 'USER') <> targetdrv THEN
508 CALL VRSetIni 'PM_DEVICE_DRIVERS', driver, targetdrv||'00'x, 'USER'
509 CALL VRSetIni 'PM_SPOOLER_DD', driver'.'model, driver'.DRV;;;'||'00'x, 'SYSTEM'
510 END
511RETURN ok
512
513/*:VRX DeletePrintDriver
514*/
515/* Removes (that is to say, de-registers with the spooler) a PM printer
516 * device driver/model.
517 *
518 * driver - The name of the printerpak driver (without path or extension)
519 * model - The printer make/model name used by the driver
520 *
521 * Returns: 0 on success, 1 on error
522 */
523DeletePrintDriver: PROCEDURE EXPOSE globals.
524 PARSE ARG driver, model
525
526 ok = VRDelIni('PM_SPOOLER_DD', driver'.'model, 'SYSTEM')
527RETURN ok
528
529/*:VRX CreatePrinterObject
530*/
531/* Create the specified printer using SysCreateObject (this should create the
532 * queue automatically).
533 *
534 * Returns: 0 on success or non-zero return code on error.
535 */
536CreatePrinterObject: PROCEDURE EXPOSE globals.
537 PARSE ARG driver, model, portname, queuename, printername
538
539 CALL LINEOUT globals.!log1, 'Creating new printer:' printername '('queuename')'
540 ok = RPUPrinterCreate( printername, queuename, portname, driver'.'model )
541RETURN ok
542
543/*:VRX GetNameFromPPD
544*/
545GetNameFromPPD: PROCEDURE
546 ARG ppd_file
547
548 IF STREAM( ppd_file, 'C', 'QUERY EXISTS') == '' THEN RETURN ''
549 nickname = ''
550 IF VRParseFilePath( ppd_file, 'E') == 'GZ' THEN DO
551 nq = RXQUEUE('CREATE')
552 oq = RXQUEUE('SET', nq )
553 ADDRESS CMD '@gzip -c -d' ppd_file '| RXQUEUE' nq
554 DO QUEUED()
555 PARSE PULL line
556 line = STRIP( line )
557 IF LEFT( line, 15 ) == '*ShortNickName:' THEN DO
558 PARSE VAR line . ':' _nick '0D'x .
559 nickname = STRIP( _nick )
560 nickname = STRIP( nickname, 'B', '"')
561 LEAVE
562 END
563 END
564 CALL RXQUEUE 'SET', oq
565 CALL RXQUEUE 'DELETE', nq
566 END
567 ELSE DO
568 CALL LINEIN ppd_file, 1, 0
569 DO WHILE LINES( ppd_file ) <> 0
570 line = STRIP( LINEIN( ppd_file ))
571 IF LEFT( line, 15 ) == '*ShortNickName:' THEN DO
572 PARSE VAR line . ':' _nick '0D'x .
573 nickname = STRIP( _nick )
574 nickname = STRIP( nickname, 'B', '"')
575 LEAVE
576 END
577 END
578 CALL STREAM ppd_file, 'C', 'CLOSE'
579 END
580
581RETURN nickname
582
583/*:VRX CleanPPD
584*/
585/* Clean out lines from Gutenprint and Foomatic PPD files that are known to
586 * cause problems when importing with PIN. (Partially based on work by Paul
587 * Smedley and Peter Brown).
588 */
589CleanPPD: PROCEDURE
590 PARSE ARG in_ppd, logfile
591 IF logfile <> '' THEN
592 logfile = STREAM( logfile, 'C', 'QUERY EXISTS')
593
594 out_ppd = VRParseFilePath( in_ppd, 'DPN') || '.TMP'
595 IF STREAM( out_ppd, 'C', 'QUERY EXISTS') \= '' THEN
596 CALL SysFileDelete out_ppd
597
598 IF logfile <> '' THEN
599 CALL CHAROUT logfile, 'Doing cleanup on' in_ppd '...'
600
601 skip_next = 0
602 DO WHILE LINES( in_ppd ) \= 0
603 line = LINEIN( in_ppd )
604 SELECT
605 WHEN skip_next == 1 THEN DO
606 line = STRIP( TRANSLATE( line ))
607 IF line == '*END' THEN skip_next = 0
608 END
609 WHEN LEFT( line, 11 ) == '*StpDefault' THEN NOP
610 WHEN LEFT( line, 7 ) == '*StpStp' THEN NOP
611 WHEN LEFT( line, 18 ) == '*StpResolutionMap:' THEN NOP
612 WHEN LEFT( line, 14 ) == '*OPOptionHints' THEN NOP
613 WHEN LEFT( line, 4 ) == '*da.' THEN NOP
614 WHEN LEFT( line, 4 ) == '*de.' THEN NOP
615 WHEN LEFT( line, 4 ) == '*es.' THEN NOP
616 WHEN LEFT( line, 4 ) == '*fi.' THEN NOP
617 WHEN LEFT( line, 4 ) == '*fr.' THEN NOP
618 WHEN LEFT( line, 4 ) == '*it.' THEN NOP
619 WHEN LEFT( line, 4 ) == '*ja.' THEN NOP
620 WHEN LEFT( line, 4 ) == '*ko.' THEN NOP
621 WHEN LEFT( line, 4 ) == '*nb.' THEN NOP
622 WHEN LEFT( line, 4 ) == '*nl.' THEN NOP
623 WHEN LEFT( line, 4 ) == '*pt.' THEN NOP
624 WHEN LEFT( line, 4 ) == '*sv.' THEN NOP
625 WHEN LEFT( line, 7 ) == '*zh_CN.' THEN NOP
626 WHEN LEFT( line, 7 ) == '*zh_TW.' THEN NOP
627 WHEN LEFT( line, 9 ) == '*Foomatic' THEN DO
628 line = STRIP( line )
629 IF RIGHT( line, 2 ) == '&&' THEN skip_next = 1
630 END
631 OTHERWISE DO
632 CALL LINEOUT out_ppd, line
633 skip_next = 0
634 END
635 END
636 END
637 CALL STREAM in_ppd, 'C', 'CLOSE'
638 CALL STREAM out_ppd, 'C', 'CLOSE'
639
640 ok = VRCopyFile( out_ppd, in_ppd )
641 IF logfile <> '' THEN DO
642 IF ok == 1 THEN
643 CALL LINEOUT logfile, 'OK'
644 ELSE DO
645 CALL LINEOUT logfile, 'Failed!'
646 CALL LINEOUT logfile, ' ->' VRError()
647 END
648 CALL LINEOUT logfile, ''
649 END
650 CALL SysFileDelete out_ppd
651
652RETURN
653
654/*:VRX MatchPrinterModel
655*/
656/* Find a set of printers supported by the OS/2 driver which mostly closely
657 * match the given name.
658 */
659MatchPrinterModel: PROCEDURE EXPOSE globals. models.
660 PARSE UPPER ARG driver_name, printer_name
661 printer_name = TRANSLATE( printer_name, '_', '.')
662 printer_drv = globals.!os2dir'\DLL\'driver_name'\'driver_name'.DRV'
663 models.0 = 0
664
665 IF SysGetEA( printer_drv, '.EXPAND', 'exist_ea') <> 0 THEN RETURN 0
666 PARSE VAR exist_ea 1 _eatype 3 .
667 IF C2X( _eatype ) <> 'FDFF' THEN RETURN 0
668
669 PARSE VAR exist_ea 3 _ealen 5 exist_models
670 total_len = C2D( REVERSE( _ealen ))
671
672 /* The variable exist_models now contains a null-separated list of printer
673 * models supported by the driver (including those from previously-imported
674 * PPD files). Next we check each one against our requested printer name.
675 */
676 start = 1
677 count = 0
678 best = 0
679 DO WHILE start < total_len
680 _strend = POS('0'x, exist_models, start )
681 IF _strend == 0 THEN LEAVE
682 _model = TRANSLATE( SUBSTR( exist_models, start, _strend - start ))
683 _model = TRANSLATE( _model, ' ', '-')
684 _comp = COMPARE( _model, printer_name )
685 IF WORD( _model, 1 ) == WORD( printer_name, 1 ) THEN DO
686 count = count + 1
687 IF _comp == 0 THEN DO
688 _comp = 9999
689 best = count
690 END
691 ELSE IF ( best == 0 ) & ( _comp > LENGTH( printer_name )) THEN
692 best = count
693/*
694 models.count = RIGHT( _comp, 4, '0') SUBSTR( exist_models, start, _strend - start )
695*/
696 models.count = SUBSTR( exist_models, start, _strend - start )
697 END
698 start = _strend + 1
699 END
700 models.0 = count
701
702/*
703 CALL SysStemSort 'models.', 'D', 'I',,, 1, 4
704 DO i = 1 TO count
705 models.i = SUBWORD( models.i, 2 )
706 END
707*/
708RETURN best
709
710
711/*:VRX CheckWritablePath
712*/
713CheckWritablePath: PROCEDURE EXPOSE globals.
714 ARG path
715
716 /* Make sure path exists & is a directory */
717 IF \VRIsDir( path ) THEN RETURN 1
718
719 /* Make sure the drive is accessible */
720 di = SysDriveInfo( VRParseFilePath( path, 'DP'))
721 IF di == '' THEN RETURN 2
722
723 /* Make sure the drive has a supported filesystem */
724 fs = SysFileSystemType( prdrv )
725 IF WORDPOS( fs, 'HPFS JFS FAT FAT32') == 0 THEN RETURN 3
726
727RETURN 0
728
729
730/*:VRX QueryAvailableDrivers
731*/
732/* Determine which of our supported PrinterPak drivers are currently available.
733 */
734QueryAvailableDrivers: PROCEDURE EXPOSE globals. drv_list.
735 drv_list.0 = 0
736
737 test_drivers = 'ECUPS ECUPS-HP PSPRINT'
738 DO i = 1 TO WORDS( test_drivers )
739 driver = WORD( test_drivers, i )
740 ok = GetDriverSource( driver )
741 IF ok == '' THEN
742 ok = VRGetIni('PM_DEVICE_DRIVERS', driver, 'USER')
743 IF ok <> '' THEN
744 CALL SysStemInsert 'drv_list.', drv_list.0+1, driver
745 END
746
747RETURN drv_list.0
748
749
750/*:VRX UpdatePrDesc
751*/
752UpdatePrDesc: PROCEDURE EXPOSE globals.
753 ARG driver, fqn
754
755 IF globals.!prdesc == '' THEN RETURN 1
756
757 ok = RPUEnumModels( fqn, 'newdevs.')
758 IF ok == 0 THEN RETURN 2
759
760 _count = 0
761 CALL LINEIN globals.!prdesc, 1, 0
762 DO WHILE LINES( globals.!prdesc )
763 _next = LINEIN( globals.!prdesc )
764 PARSE UPPER VAR _next WITH . ':' . '('_prdrv')' .
765 IF _prdrv == driver THEN ITERATE
766 _count = _count + 1
767 prdefs.count = _next
768 END
769 CALL STREAM globals.!prdesc, 'C', 'CLOSE'
770
771 DO i = 1 TO devs.0
772 _count = _count + 1
773 prdefs._count = newdevs.i':' newdevs.i '('driver')'
774 END
775 prdefs.0 = count
776
777 CALL VRSortStem 'prdefs.'
778
779 _prdir = VRParseFileName( globals.!prdesc, 'DP')
780 CALL VRCopyFile globals.!prdesc, _prdir'\PRDESC.BAK'
781 CALL VRDeleteFile globals.!prdesc
782 DO i = 1 TO prdefs.0
783 CALL LINEOUT globals.!prdesc, prdefs.i
784 END
785 CALL LINEOUT globals.!prdesc
786
787RETURN 0
788
789
790/*:VRX NLSGetMessage
791*/
792/*
793 * Gets the message text associated with the given message number from the
794 * current language file.
795 */
796NLSGetMessage: PROCEDURE EXPOSE globals.
797 PARSE ARG msgnum, .
798 args = ARG()
799
800 msgfile = globals.!messages
801 IF msgnum == '' THEN RETURN ''
802
803 sub_parms = ''
804 DO i = 2 TO args
805 sub_parms = sub_parms', "'ARG( i )'"'
806 END
807
808 INTERPRET 'msgfromfile = SysGetMessage( msgnum, msgfile' sub_parms ')'
809
810 PARSE VAR msgfromfile message '0D'x .
811 IF SUBSTR( message, 1, 4 ) == 'SYS0' THEN message = ''
812
813RETURN message
814
815
816/*:VRX NLSSetText
817*/
818/*
819 * Sets the specified property of the specified control to the specified
820 * message text.
821 */
822NLSSetText: PROCEDURE EXPOSE globals.
823 PARSE ARG control, property, message, substitution
824 args = ARG()
825
826 success = 1
827 IF args < 4 THEN
828 text = NLSGetMessage( message )
829 ELSE DO
830 sub_parms = ''
831 DO i = 4 TO args
832 sub_parms = sub_parms '"'|| ARG( i ) ||'",'
833 END
834 sub_parms = STRIP( sub_parms, 'T', ',')
835 INTERPRET 'text = NLSGetMessage( message, 'sub_parms')'
836 END
837
838 IF text == '' THEN success = 0
839 ELSE CALL VRSet control, property, text
840
841RETURN success
842
843/*:VRX StringTokenize
844*/
845StringTokenize:
846 PARSE ARG string, separator, __stem
847 CALL __StringTokenize string, separator, __stem
848 DROP __stem
849RETURN
850
851/*:VRX __StringTokenize
852*/
853__StringTokenize: PROCEDURE EXPOSE (__stem)
854 PARSE ARG string, separator, tokens
855
856 /* Note: this differs slightly from my usual implementation in that
857 * each token is STRIPped of leading and trailing spaces.
858 */
859
860 IF ( string = '') THEN RETURN string
861 IF ( separator = '') THEN separator = ' '
862
863 i = 0
864 CALL VALUE tokens || '0', i
865 DO WHILE LENGTH( string ) > 0
866 x = 1
867 y = POS( separator, string, x )
868 IF y > 0 THEN DO
869 current = SUBSTR( string, 1, y-1 )
870 x = y + 1
871 i = i + 1
872 CALL VALUE tokens || 'i', STRIP( current )
873 END
874 ELSE DO
875 current = STRIP( string, 'B', separator )
876 i = i + 1
877 CALL VALUE tokens || 'i', STRIP( current )
878 x = LENGTH( string ) + 1
879 END
880 string = SUBSTR( string, x )
881 END
882 CALL VALUE tokens || '0', i
883
884RETURN
885
Note: See TracBrowser for help on using the repository browser.